C语言结构体
为了加快数据的存取速度,编译器默认情况下会对结构体成员和结构体本身(实际上其他数据对象也是如此)存储位置进行处理,使其存放的起始地址是一定字节数的倍数,而不是顺序存放,称为字节对齐。设对齐字节数为n(n=1,2,4,8,16...),每个成员内存长度为Li,Max(Li)为最大的成员内存长度。字节对齐规则是:
1.结构体对象的起始地址能够被Max(Li)所整除。
2.结构体中每个成员相对于起始地址的偏移量,即对齐值是min(n,Li)的倍数。若不满足对齐值的要求,编译器会在成员之间填充若干个字节(称为internal padding)。
3.结构体的总长度值是min(n,MAX(Li))的倍数,若不满足总长度的值的要求,编译器在为最后一个成员的分配空间后会在其最后填充若干个字节(称为trailing padding)。
例如 VC++默认的对齐字节数n=8.
例如:
struct struct
{ {
int a; //4字节 char b;
char b;//1字节 int a;
short c;//2字节 short c;
}; };
总长度:4+1+(1)+2 总长度:1+(3)+4+2+(2)
使用预处理指令 #pragma pack(n) n=1,2,4,8.....可以设定对齐字节数
在 VC6.0 中 将n设为1后 两个结构体的长度均为 7
另外关于存储器的大小端问题:
所谓的大端模式:指低位字节存储在地址高端。
所谓的小端模式:指低位字存储在地址低端。
判别方法如下:
大端返回返回false 小端返回true
bool checkSystem()
{
union check
{
int i;
char ch
}c;
c.i=1;
return (c.ch==1);
}

浙公网安备 33010602011771号