ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
1021235 Топик полностью
fk0, легенда (27.07.2020 00:01, просмотров: 632) ответил LightElf на Блин. Компилятор поддерживает #pragma pack(). Значит утверждение "int не может лежать по невыровненному адресу" - для этого компилятора ложно. Или трусы, или крестик. Или компилятор поддерживает некую фичу и она работает как положено, или не поддерживает. А вот это вот: "мы поддерживаем-поддерживаем, но все никак не держится" - детский сад, штаны на лямках.
Ничего не значит. Int -- это конкретный тип данных, на 32-битном арме с атрибутами sizeof(int) == 4 и alignof(int) == 4. А ты хочешь тип с атрибутом aligof(type) == 1. Не может один тип данных проявлять квантовую запутанность и иметь одновременно два значения alignof! Значит это не int, это, условно, unaligned_int. А если это другой тип, это порождает массу сложностей сразу, бьющих преимущественно по программисту, хотя наверное так сделать можно. А если запутанность и 

дуализм, то как понять, сейчас он нормальный или невыравненный? Вариант, мол, пусть будет всегда невыравненный -- сам понимаешь, годится только для (радио)любителей. А я о чём говорю? Именно что "поддерживаем, но штаны не держатся", я потому и говорю, что упакованные структуры -- опасная и недоделання недофича, и против её применения. Она реально почти никогда не нужна. Всегда можно тупо в лоб написать (де)сериализацию и может быть даже выиграть в скорости. Ибо обращение к невыравненным членам -- чертовски дорогое. Проще сложить в нормальную структуру, а потом пробежаться по ней и записать каждый член с нужной шириной и без выравнивания. И обратно так же. Да, нужна лишняя память, но мегабайтные структуры встречаются редко.

[ZX]