C ++类打包/成员对齐

时间:2017-05-31 14:08:58

标签: c++ class memory-alignment packing

我知道结构打包在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)会在前面添加额外的数据。可能是其他原因导致失败?

除了某些平台上的性能不佳外,这会导致任何问题吗?

1 个答案:

答案 0 :(得分:1)

#pragma州的文档:

  

实现定义的行为由#pragma指令控制。

#pragma pack(push, 1)#pragma pack(pop)的影响(如果有的话) 是完全“实施定义。”