typedef struct structc_tag
{
char c;
double d;
int s;
} structc_t;
我在博客中讀取,這將取數據的24個字節:混亂在結構成員對齊
的sizeof(char)的+ 7字節的填充+的sizeof(雙)+的sizeof(int)的+ 4字節填充= 1 + 7 + 8 + 4 + 4 = 24字節。
我的問題是爲什麼7字節的填充,爲什麼我們不能在那裏使用3字節的填充,並利用接下來的8字節來加倍?最後4個字節需要什麼?
'double'實體應該對齊到可被8整除的地址,否則當試圖從內存加載值時,FPU可能會變得不快樂。在這種情況下,必須發出非常慢的未對齊負載(並且某些平臺根本不支持未對齊的訪問)。在x64 CPU上的64位模式下尤其如此,其中數學主要使用SSE完成。最後四個字節用於保證在堆疊多個這樣的結構時(例如,在一個'struct_t'數組中),正確對齊。 – 2012-08-09 17:41:21
通常很難確切知道實際實現中結構或對象的大小,因爲它在您使用的每個平臺上都會發生變化。您通常只需依靠編譯器盡其所能地完成必要的字段和填充以獲得最佳性能。這就是爲什麼人們在檢查對象使用的字節數時使用'sizeof()'的原因 - 即使是像int這樣的基本類型。 – Pyrce 2012-08-09 17:43:17
如果你願意,只需根據它們的大小對字段進行排序,就你的情況而言,這可能對大多數平臺有所幫助 – 2012-08-09 18:25:57