Большинство компиляторов поддерживают изменение упаковки класса с помощью #pragma pack(N)
директива, где N
это новое минимально приемлемое выравнивание для каждого члена.
Можно ли проверить во время компиляции, действительно ли #pragma pack(N)
был указан. Кроме того, есть ли способ определить N
?
Вы не можете напрямую протестировать упаковку структуры, вместо этого вам нужно создать тестовую структуру и проверить ее размер:
struct Test_Pack_Struct {
unsigned char bVal;
__int64 lVal;
};
#define GetStructPacking() (sizeof(Test_Pack_Struct)-8)
Во время компиляции вы можете проверить размер объекта со статическим утверждением (требуется C ++ 11 или выше), например:
static_assert( GetStructPacking() == 4, "Error: 4 byte packing assumed" );
Во время выполнения вы можете присвоить значение макроса GetStructPacking переменной или использовать его в выражениях:
int iPacking = GetStructPacking()
Имейте в виду, что размер структуры Test_Pack_Struct зависит от позиции, в которой она определена (заголовки, файлы кода и т. Д.).
Недостатком является то, что, если вы хотите сделать несколько проверок упаковки в одном и том же контексте, вы должны определить различные структуры (и макросы, если вы хотите использовать его).
Других решений пока нет …