Выравнивание alignas
От: LaptevVV Россия  
Дата: 25.04.24 06:21
Оценка:
Чего-то я не понимаю.
https://en.cppreference.com/w/cpp/language/alignas
Читаем: Specifies the alignment requirement of a type or an object.
Написано: требование выравнивания...
Пишу в коде:
struct alignas(1) AAA { char ch; double b; };
   struct BBB { double b; char ch; };
   struct alignas(1) CCC { int b; char ch; };
   struct DDD { short b; char ch; };
   cout << "AAA " << sizeof (AAA) << endl;
   cout << "BBB " << sizeof (BBB) << endl;
   cout << "CCC " << sizeof (CCC) << endl;
   cout << "DDD " << sizeof (DDD) << endl;

Выдает, как и без алигнаса, 16 16 8 4
g++ 8.1 minGW
Мож ключ компиляции какой надо задать ?

При этом
#pragma pack(1) вполне себе работает!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Выравнивание alignas
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.04.24 06:29
Оценка: 10 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>struct alignas(1) AAA { char ch; double b; };

LVV> cout << "AAA " << sizeof (AAA) << endl;
...
LVV>Выдает, как и без алигнаса, 16 16 8 4

Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял.

Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack
Re[2]: Выравнивание alignas
От: LaptevVV Россия  
Дата: 25.04.24 06:57
Оценка:
Pzz>Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял.
Pzz>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack
Ну, то есть, я понимал неправильно.
Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)
А оно вон оно чо, Михалыч!
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Выравнивание alignas
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.04.24 07:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

Pzz>>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack

LVV>Ну, то есть, я понимал неправильно.

А разве в него не включили какую-то хрень, начинающуюся с подчерка, которая как #pragma pack?

Я просто не очень слежу за этими новомодными хренями потому, что пока они там просочатся во все компиляторы...

LVV>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)


Куда мы там от него отказываемся? Просто старые пердуны, которых сослали в коммитет, им же надо производить вид какой-то деятельности. Вот, они и занимаются техническим творчеством на почетной и высокооплачиваемой пенсии. То модули придумают, то еще чего. Хорошо быть затейником, когда у тебя обустроенная старость...
Re[3]: Выравнивание alignas
От: andrey.desman  
Дата: 25.04.24 07:20
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)


Для gcc/clang можно использовать [[gnu::packed]] вместо alignas(1). Для MSVC только прагмы...
Отредактировано 25.04.2024 7:24 andrey.desman . Предыдущая версия .
Re[4]: Выравнивание alignas
От: LaptevVV Россия  
Дата: 25.04.24 10:46
Оценка:
LVV>>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)
AD>Для gcc/clang можно использовать [[gnu::packed]] вместо alignas(1). Для MSVC только прагмы...
Ну, на cppreference есть статья про прагму.
Я попробовал в minGW — вполне работает
g++ 8.1 С++17
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Выравнивание alignas
От: _NN_ www.nemerleweb.com
Дата: 04.05.24 15:15
Оценка:
Здравствуйте, LaptevVV, Вы писали:

Pzz>>Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял.

Pzz>>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack
LVV>Ну, то есть, я понимал неправильно.
LVV>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)
LVV>А оно вон оно чо, Михалыч!
LVV>Спасибо!

Тут вопрос что мы хотим получить.
В принципе работа с невыполненными данными может не работать в целом.
Поэтому стандарт не может добавить аналог pragma pack.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Выравнивание alignas
От: andrey.desman  
Дата: 04.05.24 15:46
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Тут вопрос что мы хотим получить.

_NN>В принципе работа с невыполненными данными может не работать в целом.
_NN>Поэтому стандарт не может добавить аналог pragma pack.

Да в принципе компилятор всегда такие данные может подгружать побайтно (а-ля инлайнить memcpy), так что варианты есть.
При этом, например, на MIPS есть команды загрузки невыровненных данных lwl/lwr, и тот же gcc как раз эти инструкции и использует при чтении из packed структур.

Это просто выглядит почище, чем руками ::memcpy везде вызывать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.