C++ struct記憶體配置大小<br />一 原則:<br />1 所有欄位在記憶體中出現順序與聲明順序一致 (理論上,譯器可以隨便放置各個欄位)<br />2 由於效能原因,大多數編譯器實際上會將struct 的各個欄位對齊放置在合適的記憶體邊界。具體細節隨著語言編譯器和CPU的不同而不同。在80X86體系中,符合Intel應用二進位介面(ABI Application Bianry Interface)的編譯器會將單位元組對象分配在struct中任意位移量處,字分配在字位移量處,而雙字或者更大的對象則分配在雙字邊界。<br />3 大多數編譯器會確保整個記錄的長度是2、4或者8個位元組的整數倍,他們通過在記錄的末尾添加補齊位元組以增加struct長度來做到這一點。編譯器之所以要補齊struct的大小,是為了要確保記錄的長度是記錄中的最大純量(Scalar)對象大小或者CPU的最優對齊大小的整數倍。<br />4 通常編譯器會提供一個選項,讓你可以在全域上禁止這一功能。很多編譯器還提供了pragma後者packed等關鍵字來讓你能夠逐struct地關掉欄位對齊(優點是節省記憶體,缺點是增加了時間開銷)<br />二 C++資料類型大小<br />char 1Byte<br />short 2Byte<br />int 4Byte<br />long long 8Byte<br />string 32Byte(Null 字元串,STL建構函式暫且將其大小置為32Byte)<br />三 VS2008中struct大小遵循的原則:<br />0 欄位在記憶體中出現順序與聲明順序一致(符合第1條)<br />1 struct的長度是最長純量的整數倍(符合第3條)<br />2 struct大小符合ABI規則(符合第2條)<br />四 例子<br />string t;<br />long long l;<br />int i;<br />char c;<br />這個大小為48=32+8+4+4<br />long long l;<br />string t;<br />int i;<br />char c;<br />這個大小為48=8+32+4+4<br />int i;<br />long long l;<br />string t;<br />char c;<br />這個大小為56=8+8+32+8<br />char c;<br />short s;<br />int i;<br />long long l;<br />string t;<br />這個大小為 48=2+2+4+8+32<br /> short a;<br />long long b;<br />char c;<br />short d;<br />int e;<br />short f;<br />long long g;<br />這個真實大小為 2+8+1+2+4+2+8 實際是8+8+2+2+4+8+8=40;<br />五 Reference<br />《編程卓越之道 第一卷 深入理解電腦》Randall Hyde 張菲譯</p><p> 呂曉磊<br /> 2010-3-21<br />