C語言的記憶體的位元組對齊的理解及其運用

2021-04-25 05:44:44 字數 1020 閱讀 7826

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作...