目錄:
1.結構體的內存對齊規則
1. 第一個成員在與結構體變量偏移量爲0的地址處。
2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
對齊數=編譯器默認的一個對齊數與該成員的大小的較小值
• VS中默認值爲8
• Linux中默認值爲4
3. 結構體的總大小爲最大對齊數(每個成員變量都有一個對齊數)的整數倍
4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,
結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
• 結構體內存的大小算每個佔的字節數,只有放的時候纔看對齊數
2.舉例說明
(1)例一:計算結構體佔多大空間
a.代碼
#include<stdio.h>
struct S1
{
char c1;
int i;
char c2;
};
int main()
{
printf("%d\n", sizeof(struct S1));
return 0;
}
b.分析
紅色部分就是因爲要對齊,補位的字節數,補位的字節數不存儲數據
只是爲了對齊
c.運行結果
(2)例二:計算結構體的大小
a.代碼
#include<stdio.h>
struct S3
{
double d;
char c;
int i;
};
int main()
{
printf("%d\n", sizeof(struct S3));
return 0;
}
b.分析
c.運行結果
(3)例三:計算結構體的大小(結構體嵌套問題)
a.代碼
#include<stdio.h>
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
printf("%d\n", sizeof(struct S4));
return 0;
}
b.分析
c.運行結果
3.修改默認對齊數
#pragma pack(num) -------設置默認對齊數爲num
#pragma pack() ----------取消設置的默認對齊數,還原爲默認
#pragma pack(1) ----------相當於不對齊
(1)#pragma pack(num)將默認對齊數修改爲2
此題中i的對齊數爲2
#include<stdio.h>
#pragma pack(2)//修改默認對齊數爲2
struct S1
{
char c1; // 1
int i; // 4
char c2; // 1
};
int main()
{
printf("%d\n", sizeof(struct S1));
return 0;
}
(2)#pragma pack() 取消設置的的默認對齊數,還原默認
#pragma pack()以將修的的默認對齊數2還原爲原默認值8
#include<stdio.h>
#pragma pack(2)
#pragma pack()//取消修改的默認對齊數,還原爲默認
struct S1
{
char c1; // 1
int i; // 4
char c2; // 1
};
int main()
{
printf("%d\n", sizeof(struct S1));
return 0;
}
(3)#pragma pack(1) 不對齊說明
#include<stdio.h>
#pragma pack(1)//相當於不對齊
struct S1
{
char c1; // 1
int i; // 4
char c2; // 1
};
int main()
{
printf("%d\n", sizeof(struct S1));
return 0;
}