gpt4 book ai didi

c++ - 在 C++ 中声明、操作和访问未对齐的内存

转载 作者:行者123 更新时间:2023-12-02 09:51:15 25 4
gpt4 key购买 nike

我最近发布了一个关于 unaligned memory access 的问题,但给出答案后,我有点失落。我经常听到“对齐的内存访问比未对齐的访问效率要高得多”,但我实际上不确定什么是未对齐的内存。因此:

  • 什么是未对齐内存?
  • 如何在 C++ 中声明未对齐的内容? (小示例程序)
  • 如何在 C++ 中访问和操作未对齐的内容? (小示例程序)
  • 是否有一种方法可以通过定义的行为方法来操作未对齐的内存,或者所有这些都与 C++ 中的平台相关/未定义的行为有关?

最佳答案

某些内容是否未对齐取决于数据类型及其大小,正如 Gregg 的回答所解释的那样。

一个编写良好的程序通常不会有未对齐的内存访问,除非编译器引入它。 (是的,这发生在矢量化过程中,但我们跳过它)。

但是您可以用 C++ 编写程序来强制进行未对齐的内存访问。下面的代码就是这样做的。

#include <iostream>
using namespace std;
int main() {

int a[3] {1, 2, 3};

cout << *((long long *)(&a[0])) << endl;
cout << *((long long *)(&a[1])) << endl;

cout << (long long) (&a[0]) << endl;
cout << (long long) (&a[1]) << endl;

return 0;

}

代码的输出是这样的

8589934593
12884901890
70367819479584
70367819479588

这个程序的作用是什么?我声明了一个大小为 3 的整数数组。该数组将是 4 字节对齐的,因为 int 是 4 字节数据类型(至少在我的平台上)。所以a[0]的地址可以被4整除。现在a[0]和a[1]的地址都可以被4整除,但只有其中一个的地址可以被8整除。

因此,如果我将 a[0] 和 a[1] 的地址转换为指向 long long 的指针(这是我平台上的 8 字节数据类型),然后引用这两个指针,其中一个将是未对齐的内存访问。据我所知,这不是未定义的行为,但它会比对齐的内存访问慢。

正如您所看到的,这段代码包含 C 风格的强制转换,这不是一个好的做法。但我认为强制实现一些奇怪的行为是可以的。

如果您对代码的输出有疑问,请告诉我。您应该了解整数的字节顺序和表示形式才能理解前两行。第三行和第四行是整数数组的前两个元素的地址。这样应该更容易理解。

关于c++ - 在 C++ 中声明、操作和访问未对齐的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com