結構體記憶體對齊

supermanman_ 發表於 2020-11-21

結構體記憶體對齊規則

  1. 第一個成員在與結構體變數偏移量為0的地址處。
  2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。
    對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。
    VS中預設的值為8
  3. 結構體總大小為最大對齊數(每個成員變數都有一個對齊數)的整數倍。
  4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整
    體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

接下來我們用幾個例子來計算一下結構體的大小吧

程式碼一

struct ps {
	char s1;
	int s2;
	char s3;
};
int main(){
	printf("%d\n", sizeof(struct ps));
	system("pause");
	return 0; 
}
執行結果為:
12

我們再在紙上詳細畫出它的過程

在這裡插入圖片描述

程式碼二

int main()
{
	struct stu{
		char s1;
		short s2;
		double s3;
		float s4;
		short s5;
		double s6;
		char s7;
		
	};
	printf("%d", sizeof(struct stu));
	system("pause");
	return 0;
}
執行結果
40

在這裡插入圖片描述

修改預設對齊數

使用#pragma pack(),可以修改預設對齊數

這裡我們把對齊數修改為1來看看執行結果

int main()
{
	struct stu{
		char s1;
		short s2;
		double s3;
		float s4;
		short s5;
		double s6;
		char s7;

	};
	printf("%d", sizeof(struct stu));
	system("pause");
	return 0;
}
執行結果為
26