1. 程式人生 > >現代計算機記憶體對齊機制

現代計算機記憶體對齊機制

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位寬所導致的關於程式對於地址空間的優化導致的。實際上,這也是一種以空間換時間的方式。

在這裡插入圖片描述