嵌套结构与扁平结构的大小相同吗?

时间:2015-08-30 20:52:05

标签: c++ struct

#include <iostream>
#include <string>

struct A { int x; };
struct B { A a; char y; };
struct C { B b; double z; };
struct D { C c; void *alpha; };
struct E { D d; float beta; };

struct F {
    int x; char y; double z; void *alpha; float beta;
};

int main()
{
    static_assert(sizeof(E) == sizeof(F), "Whoops!");
}

以上作品并给我相同的尺寸。但我更愿意保证这一切都是真的。会吗?

1 个答案:

答案 0 :(得分:3)

不,他们不必相同。这两种选择的大小也不一样,它将取决于具体情况,但正如Joachim在评论中提到的那样,填充确实起了作用。专注于更简单的类型,那些具有标准布局的类型(在示例中是POD,稍微限制一些):

struct A { int a; };         // 4 aligned, size 4
struct B { A a; char ch; };  // 4 aligned, size 8
struct C { B b; char ch2; }; // 4 aligned, size 12

原因是,为了在int中为B成员提供正确的对齐,编译器(不是强制的,但大多数编译器的目标是自然对齐)在注入之后注入3个字节的填充。 ch成员。在B内使用C时,它需要8个字节(包括3个填充),在添加ch2之后,编译器会注入额外的填充并最终浪费总共6个字节。

struct D { int a; char ch; char ch2; };

在这种情况下,chch2的自然对齐为1,因此两个成员之间没有填充。在结构的末尾会有一些填充(在这种情况下为2个字节),但总填充量会减少。