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

时间:2022-06-02 20:29:59 

在这里就分享两条开发中曾经忽略的问题:
1、Union(联合体)的字节对齐
先看代码:
#pragma pack(4)
struct com
{
 union
 {
  double dTest;
  int nTest;
  char szTest[14];
 };
 char chTest1;
 char chTest2;
};
#pragma pack()
 
sizeof(struct com) = ?
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()
 
2、不同编译器环境默认字节对齐的差别
做平台移植的同仁要注意了,遇到不确定的字节对齐问题,最好先亲自试一下,不能太想当然了:
(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字节对齐方式对齐。

标签:C++,字节对齐
0
投稿

猜你喜欢

  • 详解Java 信号量Semaphore

    2021-12-22 11:10:36
  • Android线程中Handle的使用讲解

    2023-04-04 17:43:56
  • C#使用NPOI上传excel

    2022-05-20 14:46:22
  • Java C++ 算法题解拓展leetcode670最大交换示例

    2022-05-18 23:31:51
  • c#项目将dll打包到exe中的步骤

    2021-06-21 14:44:25
  • 详解利用SpringCloud搭建一个最简单的微服务框架

    2023-08-21 04:24:32
  • 详解jeefast和Mybatis实现二级联动的问题

    2022-11-10 05:10:15
  • Java枚举类用法实例

    2023-09-25 01:47:34
  • java ThreadGroup的作用及方法详解

    2022-02-03 16:49:01
  • Android窗口小部件基础编写代码实例

    2022-05-09 20:58:00
  • Spring源码解密之自定义标签与解析

    2023-11-25 01:11:34
  • 详解Spring Boot 事务的使用

    2022-08-09 01:59:07
  • 一文带你了解SpringBoot的启动原理

    2023-11-28 20:44:42
  • C#用委托BeginInvoke做异步线程

    2023-04-22 07:23:05
  • 一文带你了解Java万物之基之Object类

    2023-10-09 01:58:28
  • Java中LocalDateTime的具体用法

    2023-11-23 14:00:05
  • Android实现自定义轮播图片控件示例

    2021-09-19 01:27:05
  • Mac OS下为Android Studio编译FFmpeg解码库的详细教程

    2023-06-30 02:37:54
  • Android 滑动监听的实例详解

    2023-10-28 14:32:32
  • Android实现登录界面记住密码的存储

    2022-11-29 04:55:44
  • asp之家 软件编程 m.aspxhome.com