C++类中的字节对齐

 

结果输出如下:

结果为:12、9

 

出人意料的,这两行语句
cout << sizeof(p) << endl;
cout << sizeof(p.x) + sizeof(p.y) + sizeof(p.z) << endl;
的输出内容为:
12
9
4 + 4 + 1 = 12 ,这是什么原因?
      解释这种原因的答案是“字节对齐”。一个C++的类的对象或结构体中含有若干成员,其占占用的总空间不见得正好就是字长(32位机上为4个字节)的整数倍,为了程序运行的效率,编译器在一定的设置下可能对里面的成员排放位置做一些调整,使得整个结构体的大小为一个字长的整数倍,这就是所谓对齐。所以如上的 Point 的内存布局可能如下图:
字节对齐

     “字节对齐”尽量使每个数据成员存放在一个完整的字里面,譬如:一个4字节长的整数,会被存放在一个完整的字里面,而不会拆成两半。既然存在“字节对齐”,设计代码的时候就要考虑到这些问题,譬如:

 

结果输出如下:

结果为:12、16

 

      我们分别对Point1 和 Point2 作图演示出这种布局的差异。可以看出,同样的数据成员,不同的排列方式会引起类的长度的差别,大家在写代码的时候一定要考虑到这一点。

 

Point1 如下:

Point1为12

 

Point2 如下:

Point2为16

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值