C 中,結構體與類的 sizeof 大小

2021-07-03 21:13:11 字數 1043 閱讀 7850

最近看到一些關於 c++ 中結構體 sizeof 的題目,了解了一下具體的情況,現在整理一下。

struct b;
首先,對於乙個結構體或是類,它的每乙個元素有三個重要的屬性: 1.偏移量,2.自身大小,3.補充大小。

一:偏移量

偏移量可以看作是,該元素之前的所有元素的(自身大小+補充大小)的總和。也就是該元素的記憶體起始位址,距離結構體內存起始位址的偏移距離。

偏移量必須滿足乙個條件: 偏移量的大小 = 自身大小 * n (n>=0)

二:自身大小

自身大小就是當前元素的 sizeof 的值,也就是其預設所佔記憶體空間的大小

三:補充大小

補充大小的產生,是為了滿足偏移量大小的約束條件的。如果當前元素的偏移量 不等於 自身大小的整數倍,那麼會在前面乙個元素的後面,新增上一定長度的記憶體空間,以滿足  偏移量的大小 = 自身大小 * n  的這個約束條件。那麼新增上的這額外的空間,就可以理解為  補充大小

四:額外要求

對於結構體的記憶體空間,還有乙個額外的要求:結構體的 sizeof 大小,必須是結構體中每乙個元素大小的整數倍;

所以總結下來,結構體大小主要需要滿足一下兩點:

1.對每乙個元素來說: 偏移量的大小 = 自身大小 * n (n>=0)

2.對結構體來說: 結構體的 sizeof 大小,必須是結構體中每乙個元素大小的整數倍;

我們來看上面的那個例子

struct b;

這樣子的話,結構體的大小應該是: 4+4+1 = 9。 但是上述計算結果只滿足了每乙個元素的偏移量的要求,考慮到   結構體的 sizeof 大小,必須是結構體中每乙個元素大小的整數倍 這個要求,9顯然不是4的整數倍,因此結構體的大小會放大到 12,也就是會在最後乙個元素 char v 後面補充大小為3的記憶體。

實際結果就是:

struct b;

再來看看另外的例子:

struct a;

class c;

因此,以後大家在計算結構體或類的大小的時候,只需要對每乙個元素,嚴格的滿足上述兩條規範,即可以計算出正確的大小了

C語言 結構體宣告與sizeof計算結構體大小

1.結構體的宣告 struct 結構體名 成員表列 例如 struct student int main struct student s2 struct student s3 struct student malloc sizeof struct student scanf s d c s2.na...

C 中結構體與類的區別

學習了c 的物件導向,最常見的和寫的就是類結構體,下面主要介紹一下結構體和類的區別。首先類是c 中物件導向獨有的,但是c和c 中都有結構體,下面我們來看一下c和c 中結構體的區別。這裡主要從封裝 多型 繼承 封裝和訪問許可權幾個方面來說。1 c和c 中結構體的區別 1 多型 c的結構體內不允許有函式...

C 中的列舉 結構體與類

注意 namespace 定義命名空間的關鍵字 enum定義列舉的關鍵字 class 定義類的關鍵字 stuct 定義結構體的關鍵字 一 列舉 列舉是一組命名整型變數,列舉型別使用enum關鍵字宣告,c 中的列舉是值型別 列舉包含自己的值,並且不能直接繼承或間接繼承 列舉列表中的每乙個符號代表乙個整...