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

首先可以肯定的说,肯定和编译器有关,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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26654257

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值