內存對齊規則

內存對齊規則

一、規則介紹

(1)第一個成員變量在結構體變量偏移量爲0的地址處
(2)其他成員變量要對齊到對齊數的整數倍的地址處
對齊數 = 編譯器默認的一個對齊數與該成員大小的較小值。 VS中默認的值爲8
Linux中的默認值爲4

(3)結構體總大小爲最大對齊數(每個成員變量都有一個對齊數)的整數倍。
(4)如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。

二、具體使用

用個例題來說明:

struct S1
{
	char c1;
	int i;
	char c2;
};
printf("%d\n", sizeof(struct S1));

程序結果:
在這裏插入圖片描述
解析:
根據規則一,所以c1佔1個字節。之後觀察i,因爲iint型,所以i佔4個字節,所以此時他們兩最少佔5個字節。因爲i佔4個字節,vs中編譯器默認的對齊數是8,於是4與8比較選擇其中較小的數,所以i的對齊數是4。再根據規則二,必須要將其對齊到對齊數的整數倍,4的整數倍有4、8、12等等,又因爲前面已知c1i最少佔5個字節,所以實際上c1i佔8個字節。再觀察c2,c2佔1個字節,並且c2的對齊數也爲1,而9是1的整數倍,所以c2位於9處,所以他們三個的總字節數位9,但是再根據規則三,所以整個結構體的大小實際上是12。
如下圖所示:
在這裏插入圖片描述

爲什麼使用內存對齊

  1. 平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
  2. 性能原因: 數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。 原因在於,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
發佈了39 篇原創文章 · 獲贊 7 · 訪問量 2644
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章