在x86-64中是否存在性能损失访问32位整数数组?

时间:2012-09-16 20:50:20

标签: c++ c x86-64

很抱歉,这个问题听起来很愚蠢。我只是模糊地认识到数据对齐的问题,并且从未做过任何64位编程。我正在研究一些32位x86代码。它经常访问int数组。有时会读取一个32位整数。有时读两个或更多。在某些时候,我想将代码设置为64位。我不确定是否应该将此int数组声明为intlong int。我宁愿保持整数的宽度相同,所以我不必担心差异。我有点担心,读取/写出与自然字不对齐的地址可能会很慢。

4 个答案:

答案 0 :(得分:7)

仅当装载或存储穿过对齐边界时才会发生未对齐惩罚。边界通常是中较小的:

  • 硬件的自然字大小。 (32位或64位*)
  • 数据类型的大小。

如果要在64位(8字节)架构上加载4字节字。它不需要8字节对齐。它只需要4字节对齐。

同样,如果您在任何计算机上加载1字节字符,则根本不需要对齐。

*请注意,SIMD向量可能意味着更大的自然字大小。例如,16字节SSE仍需要在x86和x64上进行16字节对齐。 (除非显式错位加载/存储)


简而言之,您不必担心数据对齐。语言和编译器很难阻止你担心它。

所以请坚持使用对你来说最有意义的数据类型。

答案 1 :(得分:3)

64位x86 CPU仍然经过大量优化,可以有效地处理32位值。即使在64位操作系统上,访问32位值至少与访问64位值一样快。实际上,它实际上会更快,因为消耗的缓存空间和内存带宽更少。

答案 2 :(得分:1)

这里有很多好的信息: Performance 32 bit vs. 64 bit arithmetic

更多信息https://superuser.com/questions/56540/32-bit-vs-64-bit-systems,答案声称最糟糕的速度减慢到5%(从应用程序的角度来看,而不是个别操作)。

简短的回答是否定的,你不会受到性能影响。

答案 3 :(得分:1)

每当您访问任何内存位置时,整个缓存行都会被读入L1缓存,并且对该行中任何内容的任何后续访问都会尽可能快。除非您的32位访问跨越高速缓存行(如果它在32位对齐上,它将不会),它将与64位访问一样快。