【发布时间】:2017-11-01 09:26:54
【问题描述】:
我知道结构打包在 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 pack用法和语法的一个很好的演示。正是我在寻找如何使用#pragma pack! -
请记住,在 C++ 中,
struct只是一个类,如果没有另外指定,所有成员默认为public,class只是一个类/结构,其中所有成员除非另有说明,否则默认为private,因此在我看来,更严格地仅将所需成员打包在类或结构中,而不是像您所做的那样将整个类或结构打包,同样会影响类或结构。跨度>
标签: c++ class memory-alignment packing