結構體大小計算(記憶體對齊問題和修改預設對齊數)

2021-09-01 05:50:09 字數 1787 閱讀 1886

結構體中如何計算結構體大小呢?那麼首先應該理解並掌握結構體的對齊規則,為什麼陣列中不需要對齊有人會問,這是因為陣列中放入的是同型別的資料,比如字串陣列,字元陣列,指標陣列,數值陣列等。而結構體中存放的是不同型別的資料,比如結構體成員列表可為陣列,指標,整型,字元型,浮點型等組合。總體來說結構體的記憶體對齊是拿空間來換取時間的做法,那麼在設定結構體時,我們既要滿足對齊,又要節省空間如何做到呢?只能讓占用空間小的成員盡量集中在一起。那麼結構體在對齊方式不合理時我們可以修改預設對齊數。

一.結構體對齊規則:

1.第乙個成員在與結構體變數偏移量為0的位址處 。 (第乙個成員也有對齊數)

2.其他成員變數要對齊到對齊數的整數倍的位址處。

(對齊指存放該變數時的起始偏移量必須能整除該變數的對齊數,通常是能整除對齊數的最小整數)

對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。

(vs中預設為8,linux中的預設值為4,預設引數只能設定成1,2,4,8,16)

3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

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

(乙個結構體的對齊數是結構體中最大的對齊數)

二. 修改預設對齊數

#pragma 這是個預處理指令,可以修改預設對齊數

# include

# include

//# pragma pack(1)

//# pragma pack(2) //設定預設對齊數為2

//# pragma pack(4)

//# pragma pack(8)

//# pragma pack(16)

struct s1 //結構體

;struct s2

;struct s3

;//#pragma pack() //取消設定的預設對齊數,還原為預設設定

struct s4

;struct s5

;int main (

)

1.vs預設對齊數執行結果

2.修改預設對齊數為1執行結果

3.修改預設對齊數為2的執行結果

4.修改預設對齊數為4的執行結果

5.修改預設對齊數為4的執行結果,在s4上面還原預設對齊數

6.修改預設對齊數為8或16的執行結果 (與vs預設對齊數執行結果一樣)

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

結構體內存對齊規則 第乙個成員在與結構體變數偏移量為0的位址處 其他成員要對齊到對齊數的整數倍的位址處 對齊數 編譯器預設的乙個對齊數與該成員大小的較小值 預設對齊數vs 8 linux 4 結構體總大小為最大對齊數的整數倍 如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整...

結構體大小計算

c語言 結構體大小計算 個人標籤啥東東封尾機 參考 一 結構體變數中成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 eg typedef struct stu4 stu4 typedef struct stu5 stu4 這兩個結構體大小都為8 已驗證 二 結構體大小必須是所有成員大小...

結構體大小計算

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