為什麼在C/C++中,結構體的`sizeof`大小不等於其每個成員`sizeof`大小之和?


結構體`sizeof`大小與其成員`sizeof`大小之和的差異是由於位元組填充和對齊造成的。C/C++中每種資料型別都有其對齊要求。處理器的處理字長取決於其體系結構。在32位機器上,處理字長為4位元組或32位。例如,如果你有以下結構體:

示例

#include <iostream>
using namespace std;
struct X
{
   char b[3];
   int c;
};
int main()
{
   char b[3];
   int c;
   int total = sizeof(b) + sizeof(c);
   cout << sizeof(X) << endl;
   cout << total;
}

輸出

輸出結果為:

8
7

在我的64位機器上也是如此。這是為什麼呢?因為在結構體中,它將字元陣列放入記憶體,但如果它將大小為4位元組的整數放在它的旁邊,則會違反對齊規則。所以,`b`結尾的額外位元組會被跳過,`c`從4位元組邊界開始。這就導致了額外的大小。

你可以在https://en.wikipedia.org/wiki/Data_structure_alignment.瞭解更多關於這些規則的資訊。

更新於:2020年2月11日

167 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.