C++ 类打包/成员对齐
Posted
技术标签:
【中文标题】C++ 类打包/成员对齐【英文标题】:C++ Class packing / member alignment 【发布时间】: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
,因此在我看来,更严格地仅将所需成员打包在类或结构中,而不是像您所做的那样将整个类或结构打包,同样会影响类或结构。跨度>
另见:***.com/questions/3318410/pragma-pack-effect
【参考方案1】:
#pragma
的文档指出:
实现定义的行为由
#pragma
指令控制。
所以#pragma pack(push, 1)
和#pragma pack(pop)
的效果(如果有的话)
是完全“定义的实现。”
【讨论】:
以上是关于C++ 类打包/成员对齐的主要内容,如果未能解决你的问题,请参考以下文章