本来想在google上看看#pragma pack(1)是什么意思的,却看到它还会对sizeof操作符有影响,所以就想搞清楚它们.
在google上有很多文章(可以先看看)都讲了它们的关系,可是都感觉很乱,所以自己总结了一下.
#pragma pack(x)是通知编译器内存对齐的指令
sizeof()是返回一个对象或类型名的字节长度的操作符
文字叙述:
代码:
如果定义了#pragma pack(x),判断x是否小于结构中最大的数据类型字节数 是:结构中各个数据类型按x对齐, 否:按默认对齐 没有定义#pragma pack(x),按默认对齐 默认对齐是这样子的: 如果当前数据类型不是最后一个,而且当前数据类型字节数小于下一个数据类型字节数,则当前数据类型字节数按下一个数据类型字节数对齐 最后,结构总字节数按最大数据类型字节数对齐
代码:
void 按默认对齐() { for(i=0;i<数据类型个数;++i) { if(当前数据类型<>最后一个数据类型&&当前数据类型字节数<下一个数据类型字节数) 当前数据类型字节数按下一个数据类型字节数对齐; } 结构总字节数按最大数据类型字节数对齐; } if(#pragma pack(x)==exist) { if(x<结构中最大数据类型字节数) 结构中各个数据类型按x对齐; else 按默认对齐(); } else 按默认对齐();
我提供一下网络上别人的实验:
来源
struct sample1
{
char a; /// sizeof(char) = 1
double b; /// sizeof(double) = 8
};
///default 16
#pragma pack( 4 ) 12
#pragma pack( 2 ) 10
#pragma pack( 1 ) 9
#pragma pack( 16 ) 16
struct sample2
{
char a; ///1
int b; ///4
};
#pragma pack( 8 ) 8
#pragma pack( 16 ) 8
struct sample3
{
char a; ///1
int b; ///4
char c; ///1
};
///default ///12
#pragma pack( 4 ) ///12
#pragma pack( 2 ) ///08
#pragma pack( 1 ) ///06
#pragma pack( 16 ) ///12
struct sample4
{
char a; ///1
int b; ///4
double c; ///8
char d; ///1
};
///default: ///24
#pragma pack( 4 ) ///20
#pragma pack( 2 ) ///16
#pragma pack( 1 ) ///14
#pragma pack( 16 ) ///24
struct sample5
{
char a; ///1
double c; ///8
int b; ///4
char d; ///1
};
编译器给出结果:24、20、16、14、24