內存對齊總結

今天參加了入職前的小小的培訓,培訓中老師講到了關於內存對齊的只是,以前接觸過,但是沒有深究,今天老師講了,回來便查了查資料,下面便是我對內存對齊的理解。

內存對齊對於大部分的軟件工程師來說都可以說是透明的,內存對齊應該是編譯器去管理的,C語言的特點就是強大靈活,他允許你對內存進行操作。如果你想對深層次的更加底層的東西要加以理解,就必須對內存對齊要有一定的瞭解。

首先是爲什麼我們需要對內存對齊:

1)平臺的原因:不是所有的平臺都能訪問任意地址上的任意數據的,某些硬件平臺只能訪問某些地址處的某些類型的數據,否則就異常;

2)性能的問題:爲了訪問爲對齊的數據,處理器要作兩次的內存訪問;

對齊的規則:

通常我們都討論的是結構體的數據在內存中的佈局,首先第一個數據放在offset爲0的位置上,後面的數據的佈局按照數據本身和系統默認的“對齊係數”或者是通過預編譯#pragma pack()設置的“對齊係數”中的較小的那個進行。

最後注意下圓整性就好了,也就是說最後結構體佔據的內存空間的大小是系統默認“對齊係數”或者預編譯設置的“對齊係數”的整數倍即可。

舉個例子:

#include <stdio.h>
#pragma pack(4)
struct xx{
	char b;
	long long a;
	int c;
	char d;
};
#pragma pack()

int main()
{
	struct xx x1;
	printf("&a=%p\n",&x1.a);
	printf("&b=%p\n",&x1.b);
	printf("&a=%p\n",&x1.c);
	printf("&b=%p\n",&x1.d);
	printf("%d",sizeof(x1));
	return 0;
}

通過結果我們可以看到首先b放在了offset爲0的地方,接下來a爲long long型,佔8個字節,預編譯設置的爲4字節,所以b後面會預留3個字節,以此類推,最後又添加了3個字節,是爲了滿足圓整性的要求。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章