現代計算機記憶體對齊機制
阿新 • • 發佈:2018-11-20
64位計算機和32位計算機CPU對記憶體處理的區別
64位CPU,位寬為8個位元組。(64位/8位/位元組=8位元組)
32位CPU,位寬位4個位元組。(32位/8位/位元組=4位元組)
我們假想記憶體空間是一個二階矩陣。(事實上記憶體是一維線性排列的)
那麼二維陣列的列數在64位CPU上就是8位元組,在32位CPU上就是4個位元組。
CPU為了定址方便,會自動優化記憶體,來讓資料儘量在同一二維陣列行中,以減少定址時間。(這裡我們只探討記憶體。不涉及暫存器以及cache。)
C語言結構體 作業系統進行記憶體管理的體現
我們先建立以下結構體
#include <stdio.h> struct student1 { char name[8]; int age; }; struct student2 { char name[6]; int age; };
在64位作業系統中。char型佔一個位元組。age型佔4個位元組
所以理論上,student1這個型別新建的物件所佔位元組大小應該是8+4=12個位元組。student2這個型別新建的物件所佔位元組大小應該是6+4=10位元組。
但是在實際執行中,兩個位元組大小都是12位元組。
先來看四個重要的基本概念:
1) 資料型別自身的對齊值:char型資料自身對齊值為1位元組,short型資料為2位元組,int/float型為4位元組,double型為8位元組。 2) 結構體或類的自身對齊值:其成員中自身對齊值最大的那個值。 3) 指定對齊值:#pragma pack (value)時的指定對齊值value。 4) 資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小者,即有效對齊值=min{自身對齊值,當前指定的pack值}。 基於上面這些值,就可以方便地討論具體資料結構的成員和其自身的對齊方式。 其中,有效對齊值N是最終用來決定資料存放地址方式的值。有效對齊N表示“對齊在N上”,即該資料的“存放起始地址%N=0”。而資料結構中的資料變數都是按定義的先後順序存放。第一個資料變數的起始地址就是資料結構的起始地址。結構體的成員變數要對齊存放,結構體本身也要根據自身的有效對齊值圓整(即結構體成員變數佔用總長度為結構體有效對齊值的整數倍)。
而通過彙編程式碼可以看出。編譯器自動優化了記憶體空間,兩個結構體拿到的地址都是16個位元組大小的。這也是由於CPU位寬所導致的關於程式對於地址空間的優化導致的。實際上,這也是一種以空間換時間的方式。