C++内存对齐

引言

内存对齐有利于从硬件层面提高cpu对内存的访问效率。通常情况下,cpu取数据是按照内存单元取的,而内存单元的地址是对齐的。这就意味着,内存对齐的情况下,cpu取某个地址上的数据(它存储在某个内存单元),假设cpu一次只取一个内存单元的数据,那么此时cpu只需要访问一次内存即可。但是,如果内存非对齐,这个数据就有可能落在两个内存单元,那cpu就需要至少访问两次内存。由此可见,内存不对齐的情况下,访存效率降低。

基本数据类型的对齐

以下结果是在64位系统中测试的:

数据类型 大小(字节)
short 2
char 1
int 4
float/double 8
int* 8
long 8
long long 8

对于32位系统,int*和long类型占用4字节。另外,数组是按照数组中元素的类型去对齐的,比如int[]就按照4字节对齐。

类或者结构体的对齐

首先看下面一段代码:

class A{
public:
  int* a;
  char b;
  short c;
  A() { a = new int(3); }
  ~A() { delete a; }
};

对于类或者结构体的对齐,首先考虑内部各变量自身的对齐,其次再考虑类作为一个整体,也需要按照最大的数据成员去对齐。所以综合这两个对齐要求,类A对齐之后的大小为16字节。那么A中成员变量在内存中具体是如何对齐的呢,可以参考下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aw1xBDkg-1721228233605)(https://i-blog.csdnimg.cn/direct/3589b6346ca44ddebc814ac2e9ceb289.png)]

成员a是一个指针,按照8字节对齐,其首地址为0,可以对齐。此时,b的偏移地址为8,b也可以对齐。b占用一个字节,那么c的偏移地址就是9,但c要按照2字节对齐,所以要填充一个字节,也就是x所占的位置,因此,c的偏移地址变成了10,c占用2字节,那么A的大小是12字节。但是,A需要按照8字节对齐,所以再填充4字节,总共占用16字节。
再来看看如下代码:

class A{
public:
  char b;
  int* a;
  short c;
  A() { a = new int(3); }
  ~A() { delete a; }
};

可以看到,调换了下成员变量的位置,直觉告诉我们类A的大小应该不变,但是实际上其大小变为了24字节。可以参考上述过程计算一遍。由此可见,数据成员的排列也会影响到内存对齐之后的结果。这里有一个原则,就是尽量将对齐字节数大的成员声明在前面,从而减少内存对齐时,带来额外的内存开销。

相关推荐

  1. c语言内存对齐

    2024-07-18 03:30:04       43 阅读
  2. C++内存对齐

    2024-07-18 03:30:04       21 阅读
  3. C++内存对齐知识点总结

    2024-07-18 03:30:04       35 阅读
  4. C语言】变量占用内存的大小&&内存对齐

    2024-07-18 03:30:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 03:30:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 03:30:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 03:30:04       58 阅读
  4. Python语言-面向对象

    2024-07-18 03:30:04       69 阅读

热门阅读

  1. D. The Omnipotent Monster Killer

    2024-07-18 03:30:04       23 阅读
  2. Jupyter: 交互式计算的革命

    2024-07-18 03:30:04       23 阅读
  3. 装饰模式原理与C++实现

    2024-07-18 03:30:04       26 阅读
  4. 洛谷 P1507 NASA的食物计划 (dp 01背包问题)

    2024-07-18 03:30:04       23 阅读
  5. (77)组合环路--->(01)组合环路介绍

    2024-07-18 03:30:04       21 阅读
  6. 开发扫地机器人系统时无法兼容手机解决方案

    2024-07-18 03:30:04       23 阅读
  7. Spring源码-读取XML文件配置信息

    2024-07-18 03:30:04       20 阅读
  8. 使用 Django 框架进行开发的基本模板

    2024-07-18 03:30:04       22 阅读
  9. ubuntu安装mininet-wifi

    2024-07-18 03:30:04       20 阅读