【问题标题】:Packing nested structs in C++在 C++ 中打包嵌套结构
【发布时间】:2017-10-16 20:32:57
【问题描述】:

使用 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。

【问题讨论】:

  • 查找#pragma pack,如果仅此一项不能解决问题,可能还有相关问题。

标签: c++ struct size packing


【解决方案1】:

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

准确的解释here

【讨论】:

  • 问题是char a4 完全适合最后一个填充字节,但不允许编译器将它打包到那个地方。看起来 OP 想要这种行为而不需要打包。见Standard-layout and tail padding
【解决方案2】:
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;
}

【讨论】:

    【解决方案3】:

    试试下面的代码:

    #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 的对齐方式。

    【讨论】:

      【解决方案4】:

      使用

      #pragma pack(1)
      

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

      【讨论】:

        猜你喜欢
        • 2020-12-15
        • 2013-08-07
        • 2013-09-15
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        相关资源
        最近更新 更多