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);
    
}

posted @ 2013-01-15 09:17  aswater  阅读(195)  评论(0)    收藏  举报