記憶體對齊:結構體成員存放的位址要能整除該成員本身的大小
記憶體對齊的原則:
1.前面所有成員的大小相加,應該是當前成員大小的倍數
2.整個結構體的大小應該能整除該結構體中單個最大成員的倍數
*ps 每個資料型別的大小注釋在後面
舉個栗子①
struct a
;//8
定義乙個結構體a,根據第一條原則,需要將成為short型別的大小的倍數,則需要原有大小1的情況下再加1。接著向下進行,char加上short大小1+1+2正好等於int的大小4,則此結構體大小為(1+1+2+4)=8
那麼再來乙個栗子②
struct c
;//8
這次定義乙個結構體c,第一行4是1倍數,接著向下 4+1不是2倍數 所以這時應該是4+1+3而不是4+1+2,雖然同為2的倍數,但還需滿足可整除該結構體中單個最大成員的倍數,而4是該結構體中單個成員最大的,要滿足是他的倍數只能是4+1+3=8
那麼那麼,在栗子②的情況下,迎來了我們的栗子③
struct h
d;//8
};
這裡定義乙個結構體h,且在此結構體中再定義乙個結構體hh,結構體hh大小為8,而此時為了滿足原則1,需要對char進行+操作,參考單個最大成員int,則只需+3,此時結構體h大小為1+3+8=12
栗子④
struct i;}
;//1
是1的原因為沒有定義變數 只有char
栗子⑤
struct j
;//8};
//12
此處在結構體j中定義了乙個沒有命名的變數
#pragma pack():
除此還可以使用#pragma pack()來改變編譯器的預設對齊規則,使用指#pragma pack(n),編譯器將按照n個位元組對齊,該指令還有乙個條件,雖然指定了按照n個位元組對齊,但是並不是每個成員都按照那個位元組對齊,每個成員是按自己的方式進行對齊。
再來乙個栗子
#pragma pack(8)
struct z
;
z中char型變數為1個位元組,按照對齊規則,選取min(1,8)=1,所以c按1位元組對齊,int型為4個位元組,min(8,4)=4,按4位元組對齊,所以char型,即變數c後應該補三個位元組.最終整個大小為8個位元組,剛好是8的倍數(對齊後的長度是成員中最大的對齊引數的整數倍),不用進行位元組補齊. C語言記憶體位元組對齊小結
在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...
C語言記憶體位元組對齊小結
在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...
C語言記憶體位元組對齊小結
兩句話 1 各成員變數在結構體 類 中的位址偏移是自身大小 或與指定對齊係數之間較小者 的整數倍 2 結構體 類 大小是最大成員變數 或與指定對齊係數之間較小者 整數倍 環境 在64位機器環境。1 舉例一 struct aaaa 結果,sizeof aa 12 分析 a佔1byte b佔4byte,...