用C ++打包嵌套结构

时间:2017-05-17 11:40:34

标签: c++ struct size packing

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

4 个答案:

答案 0 :(得分:0)

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;
}

答案 1 :(得分: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的对齐方式。

答案 2 :(得分:0)

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

它是一个精确的解释here

答案 3 :(得分:-1)

使用

#pragma pack(1)

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