10

在 64 位 CPU 中,如果int是 32 位,而long是 64 位,会long比 更有效int吗?

4

4 回答 4

8

您的问题的主要问题是您没有定义“高效”。有几种可能的效率相关差异。

当然,如果您需要使用 64 位,那么毫无疑问。但有时您可以使用 32 位,但您想知道使用 64 位是否会更好。

数据大小效率

使用 32 位将使用更少的内存。这更有效,特别是如果您使用大量它们。它不仅在您可能无法换出的意义上更有效,而且在您将有更少的缓存未命中的意义上也是如此。如果您只使用几个,那么效率差异是无关紧要的。

代码大小效率

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

执行速度效率

一般来说,除了代码大小所暗示的差异之外,应该没有差异。一旦指令被解码,仅仅执行的时间通常是相同的。然而,再一次,这实际上是特定于架构的。例如,有些架构没有原生 32 位算法。

我的建议:

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

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

于 2012-09-16T14:53:29.473 回答
4

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

基本智慧:编写它而不考虑此类微优化,如有必要,分析和优化。

于 2012-09-16T14:48:51.123 回答
1

如果您尝试存储 64 位数据,请使用 long。如果您不需要 64 位,请使用常规的 32 位 int。

于 2012-09-16T13:55:09.953 回答
-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;
}

如果您的 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)
于 2012-09-16T13:49:10.240 回答