2014-04-17 77 views
-1

我有點失去了對計算結構的大小尺寸結構和變量

所以我們有結構:

struct AcronymNode{ 
    struct AcronymNode* next; 
    char acronym[5]; 
    double num_phrases; 
    struct The_Phrase* phrase_list; 
    } Dictionary; 

我認爲這是

next : 4bytes 
acronym: 5bytes + 3 
num_phrases: 8bytes 
phraselist: 4bytes 
=24 bytes 

當我看在筆記它說:32個字節= 4 + 5 + 3(取向到 字)+ 4(用於對準雙)+ 8 + 4 + 4(到下一個結構對齊的8的倍數爲 的鬥BLE)

爲什麼我們對準添加額外的8,因爲它之前的第2個結構

在更高效的結構後,雙和4不溢,4它具有雙重第一,以下爲結構24個字節

此外,我想檢查,如果這是正確的

structT{ 
    int a; 
    char b[5]; 
    float c; 
    char d[2]; 
    }; 

是對大小4 + 5 + 3 + 4 + 4 = 20?

+1

出於性能原因添加了對齊。如果你不需要它,使用__attribute __((packed))(gcc/clang)。另外,編譯器不會爲你重新排序字段,這是你的責任。 – oakad

+0

這個維基百科頁面是添加填充的原因的一個很好的來源:http://en.wikipedia.org/wiki/Data_structure_alignment。 x86架構上有很好的例子。 – slaadvak

+0

這是由編譯器試圖對齊對象以匹配適合於類型的地址邊界造成的。看看[C結構中的內存對齊](http://stackoverflow.com/questions/5435841/memory-alignment-in-c-structs)。 –

回答

0

如果內存訪問延遲是不是你所關心的,您可以指示編譯器佈置在不同的排列結構(比這是最有效的機器)。例如:

#pragma pack(1) 
struct AcronymNode{ 
    struct AcronymNode* next; 
    char acronym[5]; 
    double num_phrases; 
    struct The_Phrase* phrase_list; 
    } Dictionary; 
#pragma pack() 

雖然「的#pragma包」是沒有正式的C語言的一部分,它是由大多數編譯器的支持。在上面的例子中,「的#pragma包(1)」指示編譯器包裝上的一個字節的邊界上的結構,因爲你描述它有效地改變結構的佈局:

next : 4bytes 
acronym: 5bytes + 3 
num_phrases: 8bytes 
phraselist: 4bytes 
=24 bytes 

然後,「# pragma pack()'返回對齊回到默認值。

. 

'#pragma pack(1)'通常用於定義不需要其他對齊的結構;例如,當將這種結構「通過電線」發送到另一個系統時。 Wire協議通常是打包的,以便在域之間沒有填充。