C++ 内存对齐

发布于 2023-12-23 10:46:10 字数 1797 浏览 34 评论 0

什么是内存对齐?内存对齐的原则?为什么要进行内存对齐,有什么优点?

内存对齐:编译器将程序中的每个“数据单元”安排在字的整数倍的地址指向的内存之中

内存对齐的原则:

  • 结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除;
  • 结构体每个成员相对于结构体首地址的偏移量 (offset) 都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节 (internal padding);
  • 结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节 (trailing padding)。
/*
说明:程序是在 64 位编译器下测试的
*/
#include <iostream>

using namespace std;

struct A {
  short var;  // 2 字节
  int var1;  // 8 字节 (内存对齐原则:填充 2 个字节) 2 (short) + 2 (填充) + 4
             // (int)= 8
  long var2;  // 12 字节 8 + 4 (long) = 12
  char var3;  // 16 字节 (内存对齐原则:填充 3 个字节)12 + 1 (char) + 3 (填充)
              // = 16
  string s;   // 48 字节 16 + 32 (string) = 48
};

int main() {
  short var;
  int var1;
  long var2;
  char var3;
  string s;
  A ex1;
  cout << sizeof(var) << endl;   // 2 short
  cout << sizeof(var1) << endl;  // 4 int
  cout << sizeof(var2) << endl;  // 4 long
  cout << sizeof(var3) << endl;  // 1 char
  cout << sizeof(s) << endl;     // 32 string
  cout << sizeof(ex1) << endl;   // 48 struct
  return 0;
}

进行内存对齐的原因:(主要是硬件设备方面的问题)

  1. 某些硬件设备只能存取对齐数据,存取非对齐的数据可能会引发异常;
  2. 某些硬件设备不能保证在存取非对齐数据的时候的操作是原子操作;
  3. 相比于存取对齐的数据,存取非对齐的数据需要花费更多的时间;
  4. 某些处理器虽然支持非对齐数据的访问,但会引发对齐陷阱(alignment trap);
  5. 某些硬件设备只支持简单数据指令非对齐存取,不支持复杂数据指令的非对齐存取。

内存对齐的优点:

  1. 便于在不同的平台之间进行移植,因为有些硬件平台不能够支持任意地址的数据访问,只能在某些地址处取某些特定的数据,否则会抛出异常;
  2. 提高内存的访问效率,因为 CPU 在读取内存时,是一块一块的读取。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

丑疤怪

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文