在 C++ 中,使用 long over int 有什么好处吗?
似乎 long 是 x86 和 x86_64 架构的默认字长(x86 上为 32 位,x86_64 上为 64 位,而 int 两者均为 32 位),在进行算术运算时应该(理论上)更快。
C++ 标准保证 sizeof(int) <= sizeof(long),但似乎 long 是 32 位和 64 位系统的默认大小,因此在尝试编写时应尽可能使用 long 而不是 int在两种架构上都可移植的代码?
在 C++ 中,使用 long over int 有什么好处吗?
似乎 long 是 x86 和 x86_64 架构的默认字长(x86 上为 32 位,x86_64 上为 64 位,而 int 两者均为 32 位),在进行算术运算时应该(理论上)更快。
C++ 标准保证 sizeof(int) <= sizeof(long),但似乎 long 是 32 位和 64 位系统的默认大小,因此在尝试编写时应尽可能使用 long 而不是 int在两种架构上都可移植的代码?
long
保证至少为 32 位,而int
仅保证至少为 16 位。在编写完全可移植的程序时,您可以long
在保证大小int
不足以满足您的需求的情况下使用。
但在实践中,许多人做出的隐含假设int
大于标准保证,因为他们只针对此类平台。在这些情况下,它通常并不重要。
int
应该是系统数字的“自然”大小;理论上long
可能更昂贵,但在许多架构上long
,即使long
实际比int
.
如果您需要在不同平台上保持相同大小的整数类型,则需要<stdint.h>
.
例如,如果您绝对需要 32 位无符号整数,则需要uint32_t
. 如果您绝对需要 64 位有符号整数,则需要int64_t
.
什么是更快,什么不是,每天都变得越来越难以预测。原因是处理器不再“简单”,并且由于其背后的所有复杂动态和算法,最终速度可能遵循完全违反直觉的规则。
唯一的出路就是衡量和决定。另请注意,更快的方法取决于小细节,甚至对于兼容的 CPU,对一个优化可能是对另一个的悲观。对于非常关键的部分,一些软件只是在程序初始化期间在运行时尝试并检查不同方法的时序。
也就是说,作为一般规则,您可以拥有的更快整数是int
. 仅当您特别需要它们时才应使用其他整数(例如,如果long
较大并且您需要更高的精度,或者如果short
较小但足够并且您需要节省内存)。
如果您需要特定的尺寸,那就更好了,然后使用固定的标准类型或添加一个typedef
,而不是仅仅洒long
在您需要的地方。这样就可以更容易地支持不同的编译器和架构,并且对于将来要阅读代码的人来说,意图也将更加清晰。