Нужен sizeof без учета выравнивания. В грядущем стандарте для этого вроде как будет оператор align. Хочется получить тоже самое в текущем. Мотивация: Проверить в комайл-тайме, целиком ли сериализован тип: BOOST_STATIC_ACCERT(sizeof(o) == sizeof(o.m1) + sizeof(o.m2) + sizeof(o.m3)); При включенном выравнивании ассерт может валиться даже если перечислены все мемберы.
_DEN_ Сделай невыровненный дубликат типа (обёрнутый в #pragma pack). А вообще по возможности лучше перестроить тип так, чтобы зазоров между полями не было. Кстати, если класс содержит виртуальные ф-ции или виртуальные базовые классы, то его sizeof будет всегда больше суммы sizeof полей.
asmfan Экстеншены не интересно... green Это хорошая идея, но опять же, это экстеншены. Это будет работать на gcc / icc? На камю-то уж точно не будет: Код (Text): "ComeauTest.c", line 1: warning: unrecognized #pragma Это теоретически невозможно - выравнивание может быть и 16 байт, а в структуре у меня может быть только один int. Знаю, но это пох, я полиморфные типы не сериализую.
n0name Посмотрел. Эта штука не поможет. В общем случае зная sizeof и имея набор смещений нельзя понять, все ли этот мемберы или нет.
Я пришел к выводу, что текущим стандартом это дело не решается - при выравнивании размер структуры может не поменяться если в нее добавить или удалить мемберы. Поэтому единственное решение которое я вижу это сделать выравнивание в 1 байт в дебаге, и заменить BOOST_STATIC_ASSERT на макросом, который является ассертом только в дебаге.