Упаковка класса C ++ / выравнивание элементов

Я знаю, что структурная упаковка — обычное явление в программировании на 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) добавит дополнительные данные в начало. Какие могут быть другие причины для этого провала?

Может ли это вызвать какие-либо проблемы, кроме низкой производительности на некоторых платформах?

0

Решение

Документация для #pragma состояния:

Поведение, определяемое реализацией, контролируется #pragma директивы.

Таким образом, эффект, если таковые имеются, #pragma pack(push, 1) а также #pragma pack(pop)
является полностью «реализация определена.»

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]