您的位置:首页 > 运维架构 > Linux

linux和windows gcc g++ vc编译器字节对齐

2017-09-15 16:16 363 查看
首先可以肯定的说,肯定和编译器有关,vc编译器和gcc,g++编译器肯定不一样,不说明是什么编译器什么系统下问你结构体长度就是在耍流氓。

(1)vc编译器下结构体成员首地址地址必须被该结构体成员长度整除,打个比方,double a的首地址如果为0x06, 那是不行的,再填2个字节将其首地址变为0x08。并且最后的字节总长度为最宽长度的整数倍,不足补齐(都是按照对齐模数来的)

(2)gcc和g++编译器是按照对齐模数来对齐的,double类型首元素地址如果为0x04,那么它不用再往里填4个字节补齐,因为32位linux系统gcc编译器对齐模数默认为4,如果为64

位系统gcc编译器对齐模数默认为8.当然g++编译器也一样,还有32位linux gcc编译器对齐模数为1,2,4, 64位linux gcc编译器对齐模数1,2,4,8。程序选择对齐模数应该是找大于结构体成员字节数最大值的对齐模数,不超过对齐模数的最大值(4或8)。同时最后的结构体字节数总和必须是对齐模数的整数倍,不足补齐。

(3)gcc中如果结构体内有另一个结构体对象,则字节对齐应该是按照不超过结构体内成员最大占用字节数的对齐模数来设置的,如果struct test对齐模数是4,则从是4的整数倍地址作为结构体对象成员首地址就可以了

说了这么多给了例子

struct test                        

{                                                                  

     int a;

     int b;

     double c;

     char d;

}; 

test one;

struct pp

{

    int m;

    struct test n;

};

test two;

32 位linux gcc编译器 one:20个字节(4+4+8+1+3 ), two:24个字节(4+20)

64位linux g++编译器  one:24个字节(4+4+8+1+7),two:32个字节(8+24)

windows vc编译器one:24个字节(4+4+8+1+7),two:(32个字节)(8+24)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: