每个变量在内存中被分配空间的时候,都要按照字节对齐进行存放。C语言中,只要关注char、int、float、double和指针的字节对齐问题,因为其他的类型都是由这5种类型构造而成。
三个概念:
一、默认字节对齐方式
默认字节对齐长度,和类型本身长度一致,char=1byte,short=2byte,int=4byte,long=4byte,float=4byte、double=8byte,指针=4byte。
注释:
1. 上面数据假定为32bit机器。
2. 所有指针变量,在内存中所占用空间都是一个整形长度。
3. 结构体的默认对齐方式与其成员中最大一个对齐方式相同。
例如:默认情况下,下面结构体所占空间12字节,结构体本身的默认对齐值为4。
struct temp
{
char ch,
double d
};
二、指定字节对齐方式
#gragma pack() //使用默认对齐值
#pragma pack(n) //设置当前字节对齐值为n
#pragma pack(push) //将当前的字节对齐值压栈保存
#program pack(pop) //从栈中恢复当前字节对齐值
通过上面四个指令可以设置字节对齐方式。
注释:此语句对其后声明的类型有效。
例如:如下语句,结构体1所占空间16字节,结构体2所占空间12字节。
struct temp1
{
char ch,
double d
};
#pragma pack(4)
struct temp2
{
char ch,
double d
};
三、实际字节对齐方式=MIN(默认对齐方式,指定对齐方式)
实际上,一个类型应该采取的字节对齐方式,取其默认对齐值和程序指定对齐值中最小的数。
例如:若有#pragma pack(4) 则实际对齐值,char为1,short为2,long为4,double为4.
完成下面练习:(通过ctrl+shift+8可显示答案)
举例1:
#pragma pack()
struct temp
{
char ch;
int n;
};
则:sizeof(struct temp)=8
举例2:
#pragma pack(1)
struct temp
{
char ch;
int n;
};
则:sizeof(struct temp)=5
举例3:
#pragma pack(2)
struct temp
{
char ch;
int n;
};
则:sizeof(struct temp)=6
举例4:
#pragma pack()
struct t
{
char ch;
int n;
};
struct temp
{
char ch;
struct t st;
};
则:sizeof(struct temp)=12