64位CPU上不同整数的效率

rub*_*n01 10 c int 64-bit long-integer

在64位CPU中,如果int是32位而long64位,那么long效率是否高于int

Ana*_*ile 8

你的问题的主要问题是你没有定义"有效".有几种可能的效率差异.

当然,如果你需要使用64位,那么毫无疑问.但有时你可以使用32位,你想知道使用64位代替它会更好.

数据大小效率

使用32位将使用更少的内存.这更有效,特别是如果你使用它们很多.从某种意义上说,它不仅可以更换效率,而且还可以减少缓存丢失.如果你只使用几个,那么效率差异是无关紧要的.

代码大小效率

这在很大程度上取决于架构.一些架构需要更长的指令来操作32位值,其他架构需要更长的指令来操作64位值,而其他架构则没有区别.例如,在intel处理器上,即使对于64位代码,32位也是默认的操作数大小.较小的代码在缓存行为和管道使用方面可能都有一点优势.但它依赖于体系结构,操作数大小将使用更小的代码.

执行速度效率

一般来说,除了代码大小隐含的差异之外,应该没有区别.一旦指令被解码,仅仅执行的时间通常是相同的.然而,再一次,这实际上是架构特定的.例如,有些架构没有本机32位算术.

我的建议:

如果它只是一些局部变量或小结构中的数据,你没有大量分配int,请以假设大小的方式使用和执行它,以便新版本的编译器或使用不同的编译器大小int仍然有效.

但是,如果您有大型数组或矩阵,则使用您可以使用的最小类型,并确保其大小是显式的.


fuz*_*fuz 5

在常见的 x86-64 架构上,32 位算术永远不会慢于 64 位算术。所以int速度总是相同或比 更快long。在其他实际上没有内置 32 位算术的体系结构(例如 MMIX)上,这可能不成立。

基本智慧是:编写时不要考虑此类微观优化,如有必要,请进行分析和优化。


Wol*_*lph -3

是的,64 位数字比 32 位数字更有效。

在 64 位 CPU 上,如果您要求使用 long int,大多数编译器都会为您提供 64 位。

要查看当前编译器的大小:

#include <stdio.h>

int main(int argc, char **argv){
    long int foo;
    printf("The size of an int is: %ld bytes\n", sizeof(foo));
    printf("The size of an int is: %ld bits\n", sizeof(foo) * 8);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您的 cpu 在 64 位模式下运行,您可以预期,无论您要求什么,CPU 都会使用该模式。所有寄存器都是64位的,操作也是64位的,所以如果你想获得32位结果,它通常会为你将64位结果转换为32位。

我的系统limits.h上的 定义long int为:

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX 9223372036854775807L
#  else
#   define LONG_MAX 2147483647L
#  endif
#  define LONG_MIN  (-LONG_MAX - 1L)
Run Code Online (Sandbox Code Playgroud)

  • 我应该相信这个答案的第二行吗? (3认同)
  • 一些 64 位架构(例如 x86-64)实际上具有 32 位算术运算。在这些方面,32 位算术永远不会比 64 位算术慢,有时(div/mul)甚至更快。 (2认同)