很抱歉,这个问题听起来很愚蠢。我只是模糊地认识到数据对齐的问题,并且从未做过任何64位编程。我正在研究一些32位x86代码。它经常访问int数组。有时会读取一个32位整数。有时读两个或更多。在某些时候,我想将代码设置为64位。我不确定是否应该将此int数组声明为int
或long int
。我宁愿保持整数的宽度相同,所以我不必担心差异。我有点担心,读取/写出与自然字不对齐的地址可能会很慢。
答案 0 :(得分:7)
仅当装载或存储穿过对齐边界时才会发生未对齐惩罚。边界通常是中较小的:
如果要在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位访问一样快。