在64位CPU中,如果int
是32位而long
是64位,那么long
是否比int
更有效?< / p>
答案 0 :(得分:8)
您的问题的主要问题是您没有定义“有效”。有几种可能的效率差异。
当然,如果您需要使用64位,那么毫无疑问。但有时你可以使用32位,你想知道使用64位是否会更好。
数据大小效率使用32位将使用更少的内存。这更有效,特别是如果你使用它们很多。从某种意义上说,它不仅可以更换效率,而且还可以减少缓存丢失。如果你只使用几个,那么效率差异是无关紧要的。
代码大小效率这在很大程度上取决于架构。一些架构需要更长的指令来操作32位值,其他架构需要更长的指令来操作64位值,而其他架构则没有区别。例如,在intel处理器上,即使对于64位代码,32位也是默认的操作数大小。较小的代码在缓存行为和管道使用方面可能都有一点优势。但它依赖于体系结构,操作数大小将使用更小的代码。
执行速度效率一般来说,除了代码大小隐含的差异之外,应该没有区别。一旦指令被解码,仅仅执行的时间通常是相同的。然而,再一次,这实际上是架构特定的。例如,有些架构没有本机32位算术。
我的建议:
如果只是一些局部变量或小型结构中的数据没有大量分配,请使用int
并以不假设大小的方式执行此操作新版本的编译器或使用不同大小的int
的其他编译器仍然有效。
但是,如果您有庞大的数组或矩阵,那么请使用您可以使用的最小类型,并确保其大小是明确的。
答案 1 :(得分:3)
在通用的x86-64架构上,32位算术永远不会慢于64位算术。因此,int
始终与long
的速度相同或更快。在其他实际上没有内置32位算术的架构上,例如MMIX,这可能不成立。
基本智慧认为:在不考虑微观优化的情况下编写它,并在必要时进行分析和优化。
答案 2 :(得分:1)
如果您尝试存储64位数据,请使用long。如果您不需要64位,请使用常规的32位int。
答案 3 :(得分:-3)
是的,64位数字比32位数字更有效。
在64位CPU上,如果你要求长整数,大多数编译器会给你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)