Ошибки, баги, вопросы - страница 2503

 
Alexey Viktorov:

Ну какой-же баг?

вы объявляете массив мз двух элементов по два байта и получаете как и должно бвть 4 байта. Где баг? В чём?

А вот это

выравнивается по 4 и 2 элемента будут занимать 2*8 байт.

Извините, но если такое пишите, то тему не понимаете.

Аналог на крестах:

#include <iostream>
struct alignas(4) A
{
  short j;
};

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

Ошибка наверное не здесь?

 
Vict:

Извините, но если такое пишите, то тему не понимаете.

Да нет, похоже вы не понимаете.

//g++  5.4.0

#include <iostream>
#pragma pack (push, 4)
struct A
{
  short j;
};
#pragma pack (pop)

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}
 
TheXpert:

Да нет, похоже вы не понимаете.

#pragma pack от мелкомягких очень своеобразная штучка (принцип его работы меня сейчас удивил честно говоря). Не удивительно, что попавший в стандарт alignas работает иначе.

Вот ещё:

#include <iostream>
struct A
{
  short j;
} __attribute__((aligned(4)));

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}
 
Vict:

#pragma pack от мелкомягких очень своеобразная штучка (принцип его работы меня сейчас удивил честно говоря). Не удивительно, что попавший в стандарт alignas работает иначе.

да хорош уже )

#include <iostream>
struct A
{
  short j;
} alignas(4) ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}

#pragma pack отлично пашет на gcc в том числе, а то что вы написали это как раз внутренний атрибут gcc, который работает не так, как работает aligned.

 
TheXpert:

да хорош уже )

#pragma pack отлично пашет на gcc в том числе, а то что вы написали это как раз внутренний атрибут gcc, который работает не так, как работает aligned.

Ну и что этот пример показывает? Что вы не разобрались с использованием alignas? Даже компилятор на код ругается:

1.cc:7:3: warning: attribute ignored in declaration of 'struct A' [-Wattributes]
    7 | } alignas(4) ;
      |   ^~~~~~~
1.cc:7:3: note: attribute for 'struct A' must follow the 'struct' keyword

#pragma pack странная поделка мелкомягких, которые gcc поддерживает лишь для совместимости.

 
Vict:

Ну и что этот пример показывает? Что вы не разобрались с использованием alignas?

согласен, затупил

вот правильный код

#include <iostream>
struct alignas(4) A
{
  short j;
}  ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

значит alignas не аналог упаковке.

потому что в том же gcc (чтобы без мелкомягких) кратность упаковки по умолчанию 8

потому что:

#include <iostream>
struct A
{
  short j;
};

struct B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 4 32
   return 0;
}

а вот с alignas(8)

#include <iostream>
struct alignas(8) A
{
  short j;
};

struct alignas(8) B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 16 32
   return 0;
}
 
Причем заметьте это дефолтное поведение, а не для совместимости с мелкомягкими
 
TheXpert:
Причем заметьте это дефолтное поведение, а не для совместимости с мелкомягкими

Не въехал в мысль. Всё отлично в примере, не вижу проблем. Дефолтно - выравнивание структуры == взять самое строгое требование-выравнивание среди членов.

struct {char;} == 1, struct {char; short} == 2, struct {char; int} == 4 и т.д.. Оно ведь так везде. А у long long == восемь, вот и alignas не имеет эффект.

 
Vict:

Не въехал в мысль. Всё отлично в примере, не вижу проблем.

Да, вы правы, пример не показатель.

В итоге получается, что mql pack работает как #pragma pack а не как alignas.

 
Люди, поделитесь информацией. Вы для каких целей используете выравнивание?
Причина обращения: