#pragma pack
#
1.#pragma pack使用说明#
#pragma pack(1)
#pragma pack()
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。
#pragma pack (n) // C编译器将按照n个字节对齐。
#pragma pack () // 取消自定义字节对齐方式。
#pragma pack (push,1) // 是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop) // 恢复对齐状态
因此可见,加入push和pop可以使对齐恢复到原来状态,而不是编译器默认。
2.示例#
2.1不使用#pragma pack#
#include <stdio.h>
struct sample{
char a;
double b;
};
int main()
{
struct sample sple;
sple.a = 'O';
sple.b = 12.445;
// 结果是16,因为结构体在存储时,是以结构体成员中占内存最多的数据类型所占的字节数为标准,
// 所有的成员在分配内存时都要与这个长度对齐,所以本例中char占8个字节,double占8字节
printf("%d\n",sizeof(sple));
return 0;
2.2使用#pragma pack#
#include <stdio.h>
#pragma pack(1) // 使结构体按1字节方式对齐
struct sample{
char a;
double b;
};
#pragma pack()
int main()
{
struct sample sple;
sple.a = 'O';
sple.b = 12.445;
// 结果是9,因为使用#pragma pack(1)后,
// 结构体sample为1字节对齐,char占1字节,double占8字节
printf("%d\n",sizeof(sple));
return 0;