日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言程序中結構體的內存對齊詳解_C 語言

作者:Fug_Lee ? 更新時間: 2022-12-07 編程語言

一、為什么存在內存對齊

1.平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。

2. 性能原因: 數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

總的來說結構體的內存對齊是拿空間來換取時間的做法。

二、結構體的內存對齊四規則

默認情況:默認的對齊值 8字節

1.基本數據類型有一個對齊值

2.自定義類型有一個對齊值 = 內部成員類型的最大值

3.程序的指定對齊值:#pragma pack(n) n == 2的冪次方 n可以等于2 4 8 16 …

4.程序的有效對齊值:程序的指定對齊值和數據類型對齊值得較小值

三、舉例

例1

typedef struct Test //8
{
	char a;     //1 + 7
	double b;   //8 
	int c;      //4 + 4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

分析:

char類型占一個字節,double類型占八個字節,int占四個字節;根據其對齊規則,內部成員類型的最大值為double(8個字節),所以char類型要補齊另外的七個字節,加上int的四個字節,一共是:1+7+8+4 = 20,此時20不是8的倍數,因此int要補四個字節。

結果:

例2

typedef struct Test //8
{
	char a;     //1 + 3
	int c;      //4
	double b;   //8
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));

}

分析同上

結果:

例3

typedef struct Test
{
	short a; //2 + 6
	struct
	{
		int b;   //4 + 4
		double c;//8
		char d;  //1 + 7
	};
	int e;    //4 + 4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

結果:

例4 程序中有指定對齊值時

#pragma pack(2)
typedef struct Test
{
	short a; //2
	struct
	{
		int b;   //4
		double c;//8
		char d;  //1 + 1
	};//14
	int e;    //4
}Test;
void main()
{
	Test t;
	printf("Test size = %d", sizeof(Test));
}

結果:

原文鏈接:https://blog.csdn.net/Onion_521257/article/details/105588393

欄目分類
最近更新