源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅析C++字节对齐容易被忽略的两个问题

  • 时间:2020-12-23 02:24 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析C++字节对齐容易被忽略的两个问题
在这里就分享两条开发中曾经忽略的问题: [b]1、Union(联合体)的字节对齐 [/b]先看代码: #pragma pack(4) struct com {  union  {   double dTest;   int nTest;   char szTest[14];  };  char chTest1;  char chTest2; }; #pragma pack()   [b]sizeof(struct com) = ? [/b]gcc 4.1 和 vc 2005环境下,答案是20。 调试一下结构体的内存布局,发现,union自身增加了2个字节的填充,用来保持Union本身的4字节对齐。 即union在内存中变成: union { double dTest; int nTest; char szTest[14]; byte Padding1[2]; }; 这样union就变成了16字节,加上2个char类型的字节后,为了保持struct的自身字节对齐,在struct末尾再填充两字节. 最终结构体的内存布局是这样的: #pragma pack(4) struct com { union { double dTest; int nTest; char szTest[14]; byte Padding1[2]; }; char chTest1; char chTest2; byte Padding2[2]; }; #pragma pack()   [b]2、不同编译器环境默认字节对齐的差别 [/b]做平台移植的同仁要注意了,遇到不确定的字节对齐问题,最好先亲自试一下,不能太想当然了: (1)Win32下,VC编译器默认8字节对齐,而且支持1、2、4、8、16五种对齐方式。 (2)Linux 32下,GCC 4.1默认4字节对齐,支持1、2、4三种对齐方式。因此结构体 中即使遇到double、long long这样的8字节变量,仍然按4字节对齐。即使设定了#pragma pack(8) (3)安卓4.0, arm cpu的NDK编译环境,默认情况下,遇到double、long long类型的变量时,不同于PC Linux 32,会按照8字节对齐方式对齐。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部