sizeof() 所取得的結構類型元素的大小並不總是等於每個單獨成員的大小。有時編譯器會添加一些填充以避免對齊問題。所以尺寸可能會改變。當結構成員後面跟著一個尺寸較大的成員或位於結構末端時,將添加填充。不同的編譯器有不同類型的對齊約束。在 C 標準中,總對齊結構取決於實作。
在這種情況下,雙精確度 z 為 8 位元組長,大於 x(4 位元組) )。因此又增加了 4 個位元組的填充。此外,短類型資料 y 在記憶體中具有 2 個位元組空間,因此添加了額外的 6 個位元組作為填充。
#include <stdio.h> struct myStruct { int x; //Integer takes 4 bytes, and padding 4 bytes double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 24
在這種情況下,先插入雙精度數,它佔用8 位元組的空間。現在加入了整數 x(4 位元組)。所以還有另外4個位元組的空間。新增短y後,可以放入額外的4位元組空間中,總共佔用16位元組空間。
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding int x; //Integer takes 4 bytes, and padding 4 bytes short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 16
第三種情況也佔用16位元組的記憶體空間,但排列方式不同。由於第一個成員是double,所以首先放置,然後再加入short 類型資料。現在,當整數嘗試插入時,可以將其放入剩餘的 6 位元組區域中。因此,short 之後存在一個填充,但整數資料之後不需要填充。
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes int x; //Integer takes 4 bytes, and padding 4 bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Size of struct: 16
以上是為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!