結構體的內存對齊,計算結構體的大小,修改默認對齊數

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;
}

在這裏插入圖片描述

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