#pragma pack 的用法学习

#pragma pack 的用法

#pragma是结构体( struct ),联合体(union),类(class)等的成员变量按指定的内存字节边界对齐的一种预处理指令。
内存字节对齐有:1,2,4,8,16字节对齐

该指令的一个作用:节约内存,比如#pragma pack(1),按1字节对齐

常见指令:
格式#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
1.#pragma pack(show) 显示当前的对齐字节数
2.#pragma pack(n) 设置按n字节对齐
3.#pragma pack() 设为默认值
4.#pragma pack(push) 当前对齐字节数入栈
5.#pragma pack(pop) 将栈顶数据弹出,并设置为当前值
6.#pragma pack(push,n) 将当前的对齐数压入栈顶,之后将n设置为新的当前值
7.#pragma pack(pop,n) 将栈顶数据弹出并且舍弃,之后将n设置为新的对齐字节
8.#pragma pack(push,identifier) 当前对齐字节数压栈,并将栈里保存该值的位置标识为identifier
9.#pragma pack(pop,identifier) 将栈中标识为identifier的位置的数据弹出栈,并设置为当前值
10.#pragma pack(push,identifier,n) 当前对齐字节数压栈,并将栈里保存该值的位置标识为identifier,之后把n设置为新的对齐字节数
11.#pragma pack(pop,identifier,n) 栈中标识为identifier的位置的数据弹出栈后舍弃,之后把n设置为新的对齐字节数

#include<stdio.h>
#include<stdlib.h>

//内存对齐字节可以为1,2,4,8,16
typedef struct Mystruct1 {
	char a;
	int b;
	double c;
}Mystruct1,*PMystruct1;
#pragma pack(show)             //显示当前内存对齐数:8

/*-----------------------------------------------------------------------------------*/

#pragma pack(push,2)          //将当前值内存对齐字节数8压入栈顶后,再把2设置为新的当前对齐字节数
typedef struct Mystruct2 {
	char a;
	int b;
	double c;
}Mystruct2, *PMystruct2;
#pragma pack(pop)        //将8从栈顶弹出,并设置弹出的8为当前值    
#pragma pack(show)       //8

/*-----------------------------------------------------------------------------------*/

typedef struct Mystruct3 {
	char a;
	int b;
	double c;
}Mystruct3, *PMystruct3;
#pragma pack(show)        //8

/*-----------------------------------------------------------------------------------*/

#ifdef _WIN32
	#pragma pack(push,1)  //8入栈,1为新的内存对齐字节数
#elif
	#pragma pack(1)
#endif 
typedef struct Mystruct4 {
	char a;
	int b;
	double c;
}Mystruct4, *PMystruct4;
#pragma pack(show)        //1

#ifdef _WIN32
#pragma pack(pop,2)       //将8出栈并且舍弃,2设为新的内存对齐数
#elif
	#pragma pack()        //设为默认值
#endif 
#pragma pack(show)        //2

/*-----------------------------------------------------------------------------------*/

#pragma pack(push,identifier_one)
#pragma pack(pop,identifier_one)
#pragma pack(show)                 //2

#pragma pack(push,identifier_tow,4)
#pragma pack(show)                 //4
#pragma pack(pop,identifier_tow,16)
#pragma pack(show)                 //16

/*---------------------------------------------------------------------------------- - */

int main()
{
	printf("没有设置字节对齐:%d\n", sizeof(Mystruct1));
	printf("设置字节对齐:%d\n", sizeof(Mystruct4));

	system("pause");
	return 0;
}

vs里点击编译或生成解决方案,得到下图图片


运行后:节约内存的一个案例

参考文档:
[1]: https://blog.csdn.net/g5dsk/article/details/5095008
[2]:https://docs.microsoft.com/en-us/cpp/preprocessor/pack?view=vs-2019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值