在 C++ 中打包嵌套结构

Packing nested structs in C++

使用 Visual Studio 2017,以下给出...

struct AAA // 15 bytes
{
    double d;
    short s;
    char a1;
    char a2;
    char a3;
    char s4;
    char s5;
};

struct BBB
{
    AAA d;
    char a4;
};

int main()
{
    std::cout << sizeof(AAA) << "\n"; // gives 16
    std::cout << sizeof(BBB) << "\n"; // gives 24
    getchar();
    return 0;
}

问题是...如何让 sizeof(BBB) 为 16。

struct AAA // 15 bytes
{
    double d;
    short s;
    char a1;
    char a2;
    char a3;
    char s4;
    char s5;
};

#pragma pack(1)

struct BBB
{
    AAA d;
    char a4;
};

int main()
{
    std::cout << sizeof(AAA) << "\n"; // gives 16
    std::cout << sizeof(BBB) << "\n"; // gives 17
    getchar();
    return 0;
}

尝试使用以下代码:

#pragma pack(1)
struct AAA // 15 bytes
{
    double d;
    short s;
    char a1;
    char a2;
    char a3;
    char s4;
    char s5;
};

#pragma pack(1)
struct BBB
{
    AAA d;
    char a4;
};

int main(int argc, char *argv[])
{        
    std::cout << sizeof(AAA) << "\n"; // gives 15
    std::cout << sizeof(BBB) << "\n"; // gives 16
    getchar();


    return 0;
}

结果将是:

15
16

structsunions 具有更严格的对齐要求,以确保一致的聚合和 union 存储和数据检索。建议 unionsstructures 的标量成员对齐。 结构大小必须是其对齐方式的整数倍,这可能需要在最后一个成员之后进行填充。

#pragma pack 语句更改 structure.

的对齐方式

使用

#pragma pack(1)

将导致 sizeof(AAA) 为 15,sizeof(BBB) 为 16。

使用 #pragma pack(push, 1)#pragma pack(1) 强制编译器不在 2 字节或 4 字节边界上排列结构成员,这使得处理器处理更容易和更快。因此该结构包含 秘密填充字节 来实现这一点。但是由于填充,这会增加内存使用量。

准确的解释here