為什麼在 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 位元組的 int 放置在其旁邊,則會違反對齊規則。因此,跳過 b 結尾處的額外位元組,c 從 4 位元組邊界開始。這會導致額外的空間。

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

更新於: 2020年2月11日

167 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.