Я знаю, что структурная упаковка — обычное явление в программировании на C ++ (по крайней мере, в системах с небольшим объемом памяти). Но как насчет классов.
Я знаю, что это работает, потому что я попробовал это
#include <iostream>
#pragma pack(push, 1)
class Test_Packed {
uint8_t t;
uint32_t test;
};
#pragma pack(pop)
class Test_Unpacked {
uint8_t t;
uint32_t test;
};
int main() {
std::cout<<sizeof(Test_Packed) << " / " << sizeof(Test_Unpacked)<<std::endl;
return 0;
}
Который правильно выводит «5/8».
Могу ли я предположить, что это относится ко всем соответствующим компиляторам, или эта реализация определена?
Я знаю, что добавление виртуальных членов (и, следовательно, нуждающихся в vtable) добавит дополнительные данные в начало. Какие могут быть другие причины для этого провала?
Может ли это вызвать какие-либо проблемы, кроме низкой производительности на некоторых платформах?
Документация для #pragma
состояния:
Поведение, определяемое реализацией, контролируется
#pragma
директивы.
Таким образом, эффект, если таковые имеются, #pragma pack(push, 1)
а также #pragma pack(pop)
является полностью «реализация определена.»
Других решений пока нет …