c - 在 x64 处理器上字对齐加载是否比非对齐加载更快?

标签 c alignment x86-64

在 x86/64(Intel/AMD 64 位)处理器上加载在字边界上对齐的变量是否比未对齐的加载操作更快?

我的一位同事认为,未对齐的加载很慢,应该避免。他引用了结构中项目到字边界的填充来证明未对齐的加载速度很慢。示例:

struct A {
  char a;
  uint64_t b;
};

结构 A 通常大小为 16 字节。

另一方面,documentation of the Snappy compressor声明 Snappy 假设“未对齐的 32 位和 64 位加载和存储很便宜”。根据源代码,这适用于 Intel 32 位和 64 位处理器。

所以:这里的真相是什么?未对齐的负载是否会变慢以及变慢多少?在什么情况下?

最佳答案

我在 Internet 上发现一个随机的人说,对于 486,对齐的 32 位访问需要一个周期。跨越四边形但在同一高速缓存行内的未对齐 32 位访问需要四个周期。跨越多个 缓存行的未对齐等可能需要额外六到十二个周期。

鉴于未对齐访问需要访问多个内存四边形,几乎根据定义,我对此一点也不感到惊讶。我认为现代处理器上更好的缓存性能可以降低成本,但这仍然是需要避免的事情。

(顺便说一下,如果您的代码有任何可移植性...... ia32 和后代几乎是唯一支持未对齐访问的现代架构。例如,ARM 可以在抛出一个异常,在软件中模拟访问,或者只是加载错误的值,这取决于操作系统!)

更新:这是实际去过的人 measured it .在他的硬件上,他估计未对齐的访问速度是对齐的一半。自己去试试吧...

关于c - 在 x64 处理器上字对齐加载是否比非对齐加载更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364159/

相关文章:

c - 将点击发送到小程序窗口中的自定义控件

html - CSS - 如何让不同 parent 的 child 高度相同?

html - 导航未与父 Div 垂直对齐

assembly - X86 : What does `movsxd rdx,edx` instruction mean?

linux - Perf 显示没有内存访问的 block 中的 L1-dcache-load-misses

c++ - FastCGI 如何在 Web 服务器上工作(例如 Apache 2.2+)?

c - 如何理解“"main function' s prototype cannot provided by the program”?

assembly - 为什么不能在多个函数中定义相同的局部标签?

c - 对于给定的函数,指针 c+9 指向哪个内存段?

HTML + CSS DIV对齐布局