2015-08-30 60 views
3
#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!"); 
} 

上述作品和给我相同的尺寸。但我更愿意保证这将永远是真实的。会吗?嵌套结构与扁平结构相同吗?

+3

请记住,结构填充和构件对齐可能在此处起作用。 –

+1

尝试在嵌套链和比较大小之间添加一些“虚拟”功能。 –

+1

好的电话! [他们不一样](http://coliru.stacked-crooked.com/a/909b73fb0140b0e3)。如果你让你的评论成为答案,我会接受它。 –

回答

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,编译器(不是强制的,但大多数编译器旨在自然对齐)在ch成员之后注入3个字节的填充。当在C内部使用B时,它需要8个字节(包括3个填充),在添加ch2之后,编译器注入附加填充并最终浪费总共6个字节。

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

在这种情况下,chch2自然对齐是1,所以在两个构件之间没有填充。结构的末端会有一些填充(在这种情况下为2个字节),但总填充会减少。