32位和64位下結構體內存對齊問題

2021-07-27 09:16:01 字數 697 閱讀 4501

1.先看64位下:

#include

struct a

;struct b

;int main()

輸出結果:

structa: 4+(1+3)+8+(1+7) = 24

structb: (1+7)+8+(1+7) = 24

計算結果與輸出是一樣的。

這兩個結構體在記憶體中儲存應該是下面這樣的:

struct a: 整體按照8位元組(double長度)對齊

struct b :

2.在32位下編譯,gcc 加引數 -m32

#include

struct a

;struct b

;int main()

輸出:

結果和64位下完全不一樣,很顯然它沒有按照最長成員double的8位元組對齊。稍微想一下就明白了,因為32位只有4個位元組,最長對齊模數只能按4個位元組來對齊,double 是分成了2個4位元組。上面兩個結構體在記憶體中應該是這種形式。

struct a:整體按照4位元組對齊

4+(1+3)+8+(1+3) = 20

struct b :

(1+3)+8+(1+3) = 16

記憶體空間實際上是連續的,上面分塊的畫法只是為了方便理解。

結構體內存對齊與位段

二 位段 總結 編譯器在計算結構體大小時,發生記憶體對齊 如 struct s int main 問 程式的結果是多少?char 乙個位元組 int 4個位元組 1 4 5 答案是 8。a.第乙個成員偏移量為0。b.其他成員要在 偏移 對齊數的整數倍。對齊數 編譯器預設對齊數與成員變數大小中的較小值...

結構體內存對齊,位段,列舉 聯合

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

32位和64位分配空間記憶體對齊

32位編譯器4個位元組,64位編譯器8個位元組 struct t t p 32 位 4 4 4 4 8 char a 1個位元組,為了滿足位元組對齊還需填充3個位元組 填充的3個位元組浪費,編譯器位元組對齊浪費也沒辦法 0 4 int d 4個位元組,正好滿足位元組對齊 4 5 6 7 4 int ...