-1

什么更快:(性能)

__int64 x,y;
x=y;

或者

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

?

或者他们是平等的?

4

4 回答 4

4

__int64是一个非标准的编译器扩展,所以虽然它可能更快也可能不会更快,但如果你想要跨平台代码,你不想使用它。相反,您应该考虑使用#include <cstdint>和使用uint64_t等。这些源自提供stdint.hinttypes.h用于固定宽度整数运算的 C99 标准。

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

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

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

于 2012-11-04T16:12:44.437 回答
4

我讨厌这类问题。

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

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

简而言之,您可能无法分辨,也可能无关紧要。这是一个愚蠢的问题。

于 2012-11-04T16:13:43.767 回答
1

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

于 2012-11-04T17:40:50.673 回答
0

__int64 在大多数平台上应该更快,但要小心 - 有些架构需要对齐到 8 才能生效,如果不对齐,有些架构甚至会导致您的应用程序崩溃。

于 2012-11-04T16:05:26.430 回答