#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