什么更快?两个整数或__int64?

时间:2012-11-04 16:00:27

标签: c++ performance

什么是更快:(表现)

__int64 x,y;
x=y;

int x,y,a,b;
x=a;
y=b;

或者他们是平等的?

4 个答案:

答案 0 :(得分:4)

__int64 is a non-standard compiler extension,所以虽然它可能会或可能不会更快,但如果您需要跨平台代码,则不希望使用它。相反,您should consider using #include <cstdint>并使用uint64_t等。这些来自C99标准,它为固定宽度整数算术提供stdint.hinttypes.h

就性能而言,它取决于您所使用的系统 - x86_64例如,在添加32位和64位整数时不会看到任何性能差异,因为add指令可以处理32位或64位寄存器。

但是,如果您在32位平台上运行代码或编译32位架构,则添加64位整数实际上需要添加两个32位寄存器,而不是一个。因此,如果您不需要额外的空间,分配它将是浪费。

我不知道编译器是否可以或者在必要时将类型优化到更小的尺寸。我不希望,但我不是编译工程师。

答案 1 :(得分:4)

我讨厌这些问题。

1)如果你不知道如何衡量自己,那么你几乎肯定不需要知道答案。

2)在现代处理器上很难预测基于单个指令的速度有多快,了解程序的缓存使用情况和整体性能要比担心优化使用赋值的愚蠢的小代码片段更为重要。让编译器担心这一点,并花时间改进所使用的算法或其他会产生更大影响的事情。

所以简而言之,你可能无法分辨,这可能并不重要。这是一个愚蠢的问题。

答案 2 :(得分:1)

编译器的优化器将删除示例中的所有代码,因此以这种方式没有区别。我想你想知道一次移动数据32位或一次移动64位是否更快。如果您的数据与8字节对齐并且您在64位计算机上,那么一次以8字节移动数据应该更快。然而,有几点需要注意。您可能会发现您的编译器已经在为您进行此优化(您必须查看发出的汇编代码以确定),在这种情况下您将看不到任何区别。另外,如果要移动大量数据,请考虑使用memcpy而不是自己滚动。如果您正在考虑将32位整数数组转换为64位以便更快地复制或更快地执行其他操作(即指令数量的一半),请确保Google为strict aliasing rule

答案 3 :(得分:0)

__ int64在大多数平台上应该更快,但要小心 - 一些架构需要对齐到8才能使其生效,有些甚至会在你的应用未对齐时崩溃。