C C 之記憶體對齊詳情

2021-12-30 01:25:52 字數 882 閱讀 9102

計算機系統對基本型別資料在記憶體中放的位置做了限制,它們會要求這些數的首位址是乙個數(一般為4和8)的整數倍,我們看下結構體的大小

#include

struct a

;int main()

結果:1111demacbook-pro:digui a1111$ ./sizeof

size of struct a is 8結果是8,不是5,是由於記憶體對齊導致

1:a234

5:b678

犧牲了空間,加快cpu定址速度,加快讀取記憶體資料速度。

記憶體是以位元組為單位,但處理器不是以位元組塊來訪問,一般用雙位元組,四位元組,8位元組,16位元組,或者32位元組來訪問記憶體,這些訪問單位為記憶體訪問粒度

比如沒有記憶體對齊,用4位元組訪問粒度, int變數放在位址為1的地方,我們從0位址開始讀區資料,第乙個讀區範圍是0到4,但是這事後沒有讀完,有效位址還有,4到5,然後第二次,讀區從4到8,然後把2塊有效資料合併放入暫存器,需要做很多任務作,如果有記憶體對齊,從0位址開始儲存,可以一次性讀完,不需合併資料,所以加快了效率,

加入記憶體對齊

#include

struct a

;struct b

;int main()

結果分別是:

8 12

然後用#pragma pack(n)處理記憶體不對齊,比如我們用#pragma pack(1)

#include

#pragma pack(1)

struct a

;struct b

;int main()

結果都是

6 6如果用#pragma pack(2)

結果就是

6 8我們可以這樣理解,pack(n),結構體的成員變數的首位址可以是n倍的開頭

編譯之 記憶體對齊

現代計算機中記憶體空間都是按照 byte 劃分的,也就是位元組,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊 從cpu的角度來說,cpu...

C C 記憶體管理詳情

目錄 記憶體管理是c 最令人切齒痛恨的問題,也是c 最有爭議的問題,c 高手從中獲得了更好的效能,更大的自由,c 菜鳥的收穫則是一遍一遍的檢查 和對c 的痛恨,但記憶體管理在c 中無處不在,記憶體洩漏幾乎在每個c 程式中都會發生,因此要想成為c 高手,記憶體管理一關是必須要過的,除非放棄c 轉到j ...

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...