結構體對齊計算方式

2021-10-22 22:34:19 字數 1430 閱讀 2878

結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。

由於儲存變數位址對齊的問題,結構體大小計算必須滿足兩條原則:

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

二、結構體大小必須是所有成員大小的整數倍(陣列除外,結構體中的結構體按單個變數計算)

1、簡單結構體

struct s1

;

這個結構體的大小容易計算,滿足兩個原則即可,為8,

struct s2

;

這個結構體大小是12,char ch1 是1,int i 是4,要滿足第乙個條件結構體成員的偏移量必須是成員大小的整數倍所以一共是8,char ch2是1,8+1是9,但是要滿足第二個條件結構體大小必須是所有成員大小的整數倍所以9要自加到12才滿足是4的倍數。

2、成員包含陣列的結構體

struct s3

;

這個結構體的大小是20,先看前兩個成員,大小是8,毋庸置疑,這個char型別的陣列,只需要把它看做十個char連在一起即可,加起來就是20,20滿足是int i的倍數,不需要滿足是陣列的倍數,所以結構體大小是20即可。

3、成員包含結構體的結構體

struct s4

;float f;

//4}

;

這個結構體大小是12,因為裡面的結構體只是宣告並沒有定義,在linux環境下編譯會發生錯誤。正確的寫法如下

struct s4stmp;

float f;

//4}

;

此時裡面的結構體別定義了,所以結構體大小是20,計算結構體大小時是把裡面這個結構體就看做是乙個char,和乙個int,不是看做乙個整體。

4、成員包含聯合體的結構體

struct s5;}

;

聯合體大小就是成員中最大型別的大小,所以這個結構體大小是12.

5、指定對齊值

(1)對齊值小於最大型別成員值

#pragma pack(4)  

//指定向4對齊 最大是8

struct s6

;

如果我們沒有指定對齊值,這個結構體大小是24,我們指定向4對齊,所以大小是4的倍數,不需要滿足是8的倍數,所以結構體大小是20。

(2)對齊值大於最大型別成員值

#pragma pack(10)

struct s7

;

我們指定的對齊值是10,最大為8,是否就向10對齊?不是,當指定對齊值大於自身對齊值時,向自身對其值對齊,大小是24.

總的來說,向指定對齊值和自身對齊值中較小的那個值對齊。

結構體對齊方式

對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。語法 pragma pack show push pop identifi...

結構體對齊方式詳解

1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...

有關結構體位元組對齊方式

今天偶然碰到對如下兩個結構體進行sizeof 運算 struct example1 struct example2 在計算機上執行後得到分別為24,16,網上查了一下,得到如下理解 1.計算方式 sizeof struct offsetof last item sizeof last item si...