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 只是一个类,如果没有另外指定,所有成员默认为 publicclass 只是一个类/结构,其中所有成员除非另有说明,否则默认为private,因此在我看来,更严格地仅将所需成员打包在类或结构中,而不是像您所做的那样将整个类或结构打包,同样会影响类或结构。跨度> 另见:***.com/questions/3318410/pragma-pack-effect 【参考方案1】:

#pragma 的文档指出:

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

所以#pragma pack(push, 1)#pragma pack(pop) 的效果(如果有的话) 是完全“定义的实现。”

【讨论】:

以上是关于C++ 类打包/成员对齐的主要内容,如果未能解决你的问题,请参考以下文章

c++数据对齐/成员顺序&继承

Visual Studio2008 C++结构体成员需要内存对齐吗?

C++虚基类表指针字节对齐模型

C++结构对齐问题

C++ 结构体对齐

“现在打包强制记录的字节对齐”是啥意思?