結構體大小

2021-07-03 20:37:01 字數 1430 閱讀 2785

含有基本型別的結構體的大小所對應的最終決定因素是結構體內自身成員的分布。成員不同的分布將導致含有相同成員結構體大小的不同,每個成員的對齊都是以緊接著後面的乙個為參考的,如果緊接著的大於對應指定,就以緊接著的為對齊因子,否則將聯絡周圍的具體情況進行對齊,而且對齊因子只有三種型別:1,2,4。對於最後一類孤立的成員,以結構體中最大成員一致。下面將通過例項來驗證。

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除

結構體每個成員相對於結構體首位址的偏移量是成員大小的整數背

結構體的總大小為結構體最寬基本型別成員大小的整數背

以上都是結構體中只有基本型別時的預設對齊方式,當有巢狀復合成員時,

改為:復合成員相對於結構體首位址偏移量是復合成員最寬基本型別大小的整數背

先介紹乙個相關的概念——偏移量。偏移量指的是結構體變數中成員的位址和結構體

變數位址的差。結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。

由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則:

一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)

二、結構體大小必須是所有成員大小的整數倍。

這是一種說法,還有一種說法:

結構體預設的位元組對齊一般滿足三個準則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,

如有需要編譯器會在成員之間加上填充位元組(internal adding);

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末

乙個成員之後加上填充位元組。

我自己寫了三個結構體測試了一下,**如下:

輸出結果是:128

20 先看第乙個結構體,第乙個成員a的偏移量為0。第二個成員b的偏移量是第乙個成員的偏移量加上第乙個成員的大小(0+4),其值為4;第三個成員c的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。偏移量8加上最後乙個成員c自身的大小,即為9,9不能被最寬基本型別成員大小整除,所以這裡編譯器會在最後補齊3個位元組,得出12。

至於第二個結構體,大小等於最後乙個成員的偏移量加上其大小,上面的例子中計算出來的大小為8,滿足要求。

按照上述的計算規則,結構體一和結構體二都可以計算出與輸出一致的結果,可是結構體三有點不明白。

偏移量 

填充位元組 

成員自身大小

0  4

4  1

5  1 

2 8 

8 16 

4

結構體大小

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...

結構體大小

下面結構體 struct s1 char ch,ptr union short a,b unsigned int c 2,d 1 struct s1 next sizeof struct s1 是 16位元組 這個呢,char ch乙個位元組,char ptr四個位元組,共用體裡面short a,b...

結構體大小

struct date struct student 每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍,否則編譯器會在前乙個成員後面填充位元組,使得當前成員的偏移量是其記憶體大小的整數倍 陣列的位元組對齊值等於它的乙個元素的位元組對齊值 結構體的位元組對齊值等於它的所有成員的位元組對齊值中的最...