c語言的記憶體的位元組對齊的理解於運用
由於現在記憶體的安排一般是4位元組對齊的,
所以在進行結構的定義的時候,順序不同其所佔記憶體也是不一樣的。
1, 問題的提出
typedef struct t t;
typedef struct t2 t2;
intmain(void)
;t2 lt2 = ;
printf("sizeof(lt) = %d/n", sizeof(lt)); //12
printf("sizeof(lt2) = %d/n", sizeof(lt2)); //8
return 0;
}sizeof(lt) = 12
sizeof(lt2) = 8
可以看到雖然t只定義兩個char,按推理來說應該是佔4+4+1+1應該是10。
但是結果卻是12。按推理來說第2個結果的長度應該是4+1應該是5才對,
但結果卻是8。何解?
在c語言中我們的記憶體一般是4位元組對齊的,這樣cpu在處理資料的時候,
才不至於浪費時間。編譯器回把多餘的空間填充成0。
2, 問題的解決
所以當我們在定義結構的時候就要注意這個事實,才不會浪費空間。
浪費空間的結構設計:
struct ab ;
如果這樣交叉定義的話,將會浪費一些空間。上面的定義結構體ab,
的sizeof的值,將會是4+4+4+4,按照4位元組對齊的安排。
而,這樣定義將會節省一些空間:
struct ab ;
這樣的話,所佔空間將是4+4+4。
3, 怎麼辦
當定義結構時,如果結構成員的所佔記憶體大小不是4的倍數,
多出的將會自動被初始化為0。
struct ac ;
這裡的結構實際上分配了 10+4+2個位元組空間。
因為這樣才可以湊夠4的倍數。
小結: 在不同的平台對齊的方式不一樣,有的是8位元組對齊的,但大多數是4位元組對齊的。
在寫程式時,要根據同平台具體處理。
C語言 位元組對齊(記憶體對齊)
1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常 2 硬體原因 經過記憶體對齊之後,cpu的記憶體訪問速度大大提公升。1.對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,...
C語言記憶體位元組對齊
在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...
C 記憶體的位元組對齊
在訪問記憶體時,如果位址是按4位元組對齊,則訪問效率會高很多。這種現象的原因在於訪問記憶體的硬體電路。一般情況下,位址匯流排總是按照對齊後的位址來訪問。例如,你想得到0x00000001開始的四位元組內容,系統首先需要以0x00000000讀四位元組,從中取得3位元組,然後再用0x00000004作...