首頁  >  文章  >  後端開發  >  為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?

為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?

PHPz
PHPz轉載
2023-08-26 09:29:07834瀏覽

sizeof() 所取得的結構類型元素的大小並不總是等於每個單獨成員的大小。有時編譯器會添加一些填充以避免對齊問題。所以尺寸可能會改變。當結構成員後面跟著一個尺寸較大的成員或位於結構末端時,將添加填充。不同的編譯器有不同類型的對齊約束。在 C 標準中,總對齊結構取決於實作。

情況 1

在這種情況下,雙精確度 z 為 8 位元組長,大於 x(4 位元組) )。因此又增加了 4 個位元組的填充。此外,短類型資料 y 在記憶體中具有 2 個位元組空間,因此添加了額外的 6 個位元組作為填充。

為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?

範例程式碼

#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));
}

輸出2

Size of struct: 24

情況2

在這種情況下,先插入雙精度數,它佔用8 位元組的空間。現在加入了整數 x(4 位元組)。所以還有另外4個位元組的空間。新增短y後,可以放入額外的4位元組空間中,總共佔用16位元組空間。

為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?

範例程式碼

#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));
}

輸出2

Size of struct: 16

情況3

第三種情況也佔用16位元組的記憶體空間,但排列方式不同。由於第一個成員是double,所以首先放置,然後再加入short 類型資料。現在,當整數嘗試插入時,可以將其放入剩餘的 6 位元組區域中。因此,short 之後存在一個填充,但整數資料之後不需要填充。

為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?

範例程式碼

#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));
}

輸出2

Size of struct: 16

以上是為什麼在C/C++中,結構體的sizeof不等於每個成員的sizeof總和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除