2015-08-30 97 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個字節),但總填充會減少。