在 64 位 CPU 中,如果int
是 32 位,而long
是 64 位,会long
比 更有效int
吗?
4 回答
您的问题的主要问题是您没有定义“高效”。有几种可能的效率相关差异。
当然,如果您需要使用 64 位,那么毫无疑问。但有时您可以使用 32 位,但您想知道使用 64 位是否会更好。
数据大小效率使用 32 位将使用更少的内存。这更有效,特别是如果您使用大量它们。它不仅在您可能无法换出的意义上更有效,而且在您将有更少的缓存未命中的意义上也是如此。如果您只使用几个,那么效率差异是无关紧要的。
代码大小效率这在很大程度上取决于架构。一些架构需要更长的指令来操作 32 位值,其他架构需要更长的指令来操作 64 位值,而其他架构则没有区别。例如,在 intel 处理器上,即使是 64 位代码,32 位也是默认操作数大小。较小的代码可能在缓存行为和管道使用方面都有一点优势。但这取决于操作数大小将使用更小的代码的架构。
执行速度效率一般来说,除了代码大小所暗示的差异之外,应该没有差异。一旦指令被解码,仅仅执行的时间通常是相同的。然而,再一次,这实际上是特定于架构的。例如,有些架构没有原生 32 位算法。
我的建议:
如果只是小型结构中的一些局部变量或数据,您不会大量分配,请以不int
假定大小的方式使用和执行它,以便新版本的编译器或使用不同的编译器size for仍然有效。int
但是,如果您有巨大的数组或矩阵,则使用您可以使用的最小类型并确保其大小是明确的。
在常见的 x86-64 架构上,32 位算术永远不会比 64 位算术慢。所以int
总是相同的速度或更快long
。在其他实际上没有内置 32 位算术的架构上,例如 MMIX,这可能不成立。
基本智慧:编写它而不考虑此类微优化,如有必要,分析和优化。
如果您尝试存储 64 位数据,请使用 long。如果您不需要 64 位,请使用常规的 32 位 int。
是的,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)