C語言程序中結構體的內存對齊詳解
一、為什么存在內存對齊
1.平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2. 性能原因: 數(shù)據(jù)結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
總的來說結構體的內存對齊是拿空間來換取時間的做法。
二、結構體的內存對齊四規(guī)則
默認情況:默認的對齊值 8字節(jié)
1.基本數(shù)據(jù)類型有一個對齊值
2.自定義類型有一個對齊值 = 內部成員類型的最大值
3.程序的指定對齊值:#pragma pack(n) n == 2的冪次方 n可以等于2 4 8 16 …
4.程序的有效對齊值:程序的指定對齊值和數(shù)據(jù)類型對齊值得較小值
三、舉例
例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類型占一個字節(jié),double類型占八個字節(jié),int占四個字節(jié);根據(jù)其對齊規(guī)則,內部成員類型的最大值為double(8個字節(jié)),所以char類型要補齊另外的七個字節(jié),加上int的四個字節(jié),一共是:1+7+8+4 = 20,此時20不是8的倍數(shù),因此int要補四個字節(jié)。

結果:

例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));
}
結果:

以上就是C語言程序中結構體的內存對齊詳解的詳細內容,更多關于C語言結構體內存對齊的資料請關注腳本之家其它相關文章!
相關文章
C++ 中 const和static readonly區(qū)別
這篇文章主要介紹了C++ 中 const和static readonly區(qū)別的相關資料,需要的朋友可以參考下2017-05-05
三種獲取網(wǎng)頁源碼的方法(使用MFC/Socket實現(xiàn))
Windows下比較簡單的獲取網(wǎng)頁源碼的方法:使用MFC、使用MFC、Socket實現(xiàn)2013-12-12

