作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近发布了一个关于 unaligned memory access 的问题,但给出答案后,我有点失落。我经常听到“对齐的内存访问比未对齐的访问效率要高得多”,但我实际上不确定什么是未对齐的内存。因此:
最佳答案
某些内容是否未对齐取决于数据类型及其大小,正如 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/
我是一名优秀的程序员,十分优秀!