Здравствуйте, LaptevVV, Вы писали:
LVV>struct alignas(1) AAA { char ch; double b; }; LVV> cout << "AAA " << sizeof (AAA) << endl;
... LVV>Выдает, как и без алигнаса, 16 16 8 4
Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял.
Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack
Pzz>Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял. Pzz>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack
Ну, то есть, я понимал неправильно.
Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)
А оно вон оно чо, Михалыч!
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
Pzz>>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack LVV>Ну, то есть, я понимал неправильно.
А разве в него не включили какую-то хрень, начинающуюся с подчерка, которая как #pragma pack?
Я просто не очень слежу за этими новомодными хренями потому, что пока они там просочатся во все компиляторы...
LVV>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули)
Куда мы там от него отказываемся? Просто старые пердуны, которых сослали в коммитет, им же надо производить вид какой-то деятельности. Вот, они и занимаются техническим творчеством на почетной и высокооплачиваемой пенсии. То модули придумают, то еще чего. Хорошо быть затейником, когда у тебя обустроенная старость...
LVV>>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули) AD>Для gcc/clang можно использовать [[gnu::packed]] вместо alignas(1). Для MSVC только прагмы...
Ну, на cppreference есть статья про прагму.
Я попробовал в minGW — вполне работает
g++ 8.1 С++17
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
Pzz>>Ты тут указал, на какой адрес должно выравниваться начало структуры. Но есть еще double внутри нее, у которого свою собственные требования по выравниванию, и их никто не отменял. Pzz>>Короче, эта хрень может добавить требований, но не может убрать уже существующие. В отличии от #pragma pack LVV>Ну, то есть, я понимал неправильно. LVV>Я то думал, что вот, ура, в язык включили средство, потихоньку от препроцессора отказываемся (ну, как модули) LVV>А оно вон оно чо, Михалыч! LVV>Спасибо!
Тут вопрос что мы хотим получить.
В принципе работа с невыполненными данными может не работать в целом.
Поэтому стандарт не может добавить аналог pragma pack.
Здравствуйте, _NN_, Вы писали:
_NN>Тут вопрос что мы хотим получить. _NN>В принципе работа с невыполненными данными может не работать в целом. _NN>Поэтому стандарт не может добавить аналог pragma pack.
Да в принципе компилятор всегда такие данные может подгружать побайтно (а-ля инлайнить memcpy), так что варианты есть.
При этом, например, на MIPS есть команды загрузки невыровненных данных lwl/lwr, и тот же gcc как раз эти инструкции и использует при чтении из packed структур.
Это просто выглядит почище, чем руками ::memcpy везде вызывать.