結構體內存對齊 計算結構體的大小

2021-10-10 18:15:45 字數 1158 閱讀 6371

在求結構體的大小時,絕大部分情況下不會直接等於各個成員大小的總和,編譯器為了優化對結構體成員的訪問總會在結構體中插入一些空白位元組(記憶體對齊)例如:

struct s1

;printf

("%d\n"

,sizeof

(s1));

struct s3

;printf

("%d\n"

,sizeof

(s3)

);

結構體s1和s3的大小並不是我們想當然的各成員大小之和6,而是s1為8,s3為12之所以會出現這樣的情況,是因為結構體的記憶體對齊

1、平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的:某些硬體平台只能在某些位址處理某些特定型別的資料,否則丟擲硬體異常。

2、資料結構應該盡可能的在自然邊界上對齊,因為為了訪問未對齊的記憶體,處理器需要做兩次記憶體訪問;而對齊的記憶體僅需要訪問一次,可以提高效率。

通過犧牲空間來換取時間的方案就是記憶體對齊

1、第乙個成員不需要記憶體對齊(第乙個成員在於結構體變數偏移量為0的地質處)。

2、其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊:起始偏移量能整除對齊數

對齊數:編譯器沒有預設對齊數,一般為自身大小(即自身型別的大小,如char 為1 ,int 為4)。

3、結構體的大小為最大對齊數的整數倍,即最終結構體的大小一定能被最大對齊數整除(第乙個成員也要參與計算)。

4、如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

含巢狀結構體的對齊數:就是結構體內的最大對齊數

首先我們來分析一下前面的s1,s3

struct s1

;printf

("%d\n"

,sizeof

(s1));

struct s3

;printf

("%d\n"

,sizeof

(s3)

);

struct s4

;

希望對您有所幫助!

結構體對齊 結構體內存布局

在c語言中,可以通過 pragma pack n 來指定結構體按n位元組對齊 這裡的n是2的較小整數次冪 如果程式設計者不指定對齊位元組數,那麼預設的會按照結構體中最長那一項對齊,如在64位作業系統中,當結構體中出現 void long 型別,則必然是按照8位元組對齊 當最大的是int,那麼就按照4...

記憶體對齊之結構體大小的計算

結構體變數的位址受到記憶體對齊規則的影響,使得結構體成員並不是在記憶體中 緊挨 著的。可以參照如下結構體 10執行結果如下 最終,我用excel 的形式,做出如下的結構體成員的記憶體分配位置,如下圖黃色為實際存在資料的記憶體單元,白色空格為適應記憶體對齊而進行的偏移量。需要注意系統預設是4位元組對齊...

結構體的大小 記憶體對齊

includeusing namespace std struct t1 結果為8的倍數,因為最大成員型別double佔8位元組 16 struct t2 結果為2的倍數,因為最大成員型別short佔2位元組 4 struct t3 結果為8的倍數,因為最大成員型別double佔8位元組 16 st...