C++字节对齐

来源:互联网 发布:贴吧发广告软件 编辑:程序博客网 时间:2024/06/15 03:45

系统让程序中的变量按字节对齐的目的:访问高效!字节是内存空间分配的最小单位,在程序中,我们定义的变量可以放在任何位置,但实际情况是访问特定类型变量的时候在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间排列,而不是顺序的一个接着一个排列。


准则:


        其实字节对齐的细节和具体编译器实现有关,但一般而言,满足以下五个:

    • 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
    • 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节
    • 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果需要编译器会在最末一个成员之后加上填充字节
    • 结构体的整体长度与其中结构体成员无关,而是整个结构体(包括结构体成员内部)中最长数据类型的整数倍
    • 使用#pragma pack(n)规定程序中字节对齐大小


举例:


因为系统有可能是32位或64位,所以long,double类型字节长度有可能不同,32位系统是4字节,64位系统是8字节,测试系统64位,基本类型大小不再讨论,现在讨论结构体的字节对齐问题

class test{private:    char value1;                                                                                                              };int main(int argc, char *argv[]){    cout<<sizeof(class test)<<endl;    return 0;}

输出1,因为结构体大小是最宽基本类型成员大小的整数倍,最宽基本类型是char

class test{private:    char value1[3];                                                                                                           };int main(int argc, char *argv[]){    cout<<sizeof(class test)<<endl;    return 0;}
输出3,和上面举例同理

class test{private:    char value1[3];    int value2;                                                                                                               };int main(int argc, char *argv[]){    cout<<sizeof(class test)<<endl;    return 0;}
输出8,因为结构体大小是最宽基本类型成员大小的整数倍,最宽基本类型是int
class test_in{private:    char value1;    short value2;};class test{private:    char value1;    test_in value2; };int main(int argc, char *argv[]){    cout<<sizeof(class test_in)<<endl;                                                                                            cout<<sizeof(class test)<<endl;    return 0;}
输出4,6,正如第四条准则所说

注意:在sizeof(class)大小时,要注意是否有虚函数,如果有虚函数,判断大小时要考虑虚指针,虚指针的大小和系统的位数有关,64位系统是8字节,32位系统是4字节。



原创粉丝点击