C語言中的字節對齊

在看php源碼時,分析變量大小時遇到了問題,結構體所佔用的大小並不是簡單的將裏邊成員所佔大小相加,而是有字節對齊的問題,先看一個小例子:

#include <stdio.h>

int main(){
	struct _s{
		char a;//1字節
		int b;//4字節
		long c;//8字節
		void* d;//8字節
		int e;//4字節
		char* f;//8字節
	} s;
	printf("struct type size:%d\n",sizeof(s));
	return 1;
}

這個會輸出33嗎,經過試驗,輸出爲40。下面就講一下字節對齊。

結構體是一種數據類型,裏面存放着不同數據類型的成員,不同的成員所佔的內存空間是不同的,那系統是怎麼給結構體變量分配內存呢,通過上面例子可以得出不是順序存放的。其實是按字節對齊存放的,也就是按結構體成員中佔內存最多的字節數爲標準,其他成員在分配內存時都要與這個長度對其,下面畫圖表示一下上面的例子。

64位機器上long類型爲8字節,指針也爲8字節,所以該結構體中佔內存最大的爲8字節,char a 與int b之間會空出3個字節,int e後邊也會空出4個字節,所以總共爲40個字節。

總結一下,所有的成員在分配內存時都要與所有成員中佔內存最多的數據類型所佔內存空間的字節數對其,比如這個字節數爲N,理論上所有成員在分配內存時都是緊接在前一個變量後面以此填充的,如果一行中剩下的空間不足以填充某成員變量,則該成員變量在分配內存時會另起一行分配。

分配內存時也和變量的放置的位置有關係,比如上邊的例子,如果是以下這樣的

#include <stdio.h>

int main(){
	struct _s{
		char a;//1字節
		long c;//8字節
		int b;//4字節
		void* d;//8字節
		int e;//4字節
		char* f;//8字節
	}s;
	printf("struct type size:%d\n",sizeof(s));
	return 1;
}

int b放在了long c後面,運行出來的結果爲48,發生了變化,用圖解釋一下

所以在聲明結構體類型時,各類型成員的前後位置會對結構體類型定義的變量大小產生影響,沒有規律的定義會增加系統給結構體分配的字節數,降低了內存分配的效率,但這種影響幾乎是可以忽略不計的,所以在寫程序時儘量成員類型所佔字節數從大到小或者從小到大寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章