C++中的int和long有什么区别?

6
在C++中,使用long而不是int是否有好处?
在x86和x86_64架构中,long似乎是默认的字长(x86上为32位,x86_64上为64位,而int在两者上均为32位),在进行算术运算时应该(理论上)更快。
C ++标准保证sizeof(int)<= sizeof(long),但似乎long在32位和64位系统上都是默认大小,因此在编写可在两种体系结构上移植的代码时,是否应该尽可能使用long而不是int?

1
在Windows上,long是32位的。在Linux上,long是64位的。这破坏了很多应用程序。 - Mysticial
3个回答

5

long 至少保证为32位,而 int 只保证至少为16位。当编写完全可移植的程序时,如果需要的话,可以使用 long 替代 int

然而,在实际情况中,许多人默认假设 int 大于标准保证,因为他们只针对这样的平台。在这些情况下,通常并不重要。

int 应该是系统中数字的“自然”大小;理论上说,long 可能更昂贵,但在许多体系结构中,即使 long 实际上比 int 更长,对 long 的操作也不会更昂贵。


4

如果你需要在不同平台下保持相同大小的整数类型,那么你需要使用<stdint.h>中的类型。

例如,如果你确实需要一个32位无符号整数,可以使用uint32_t。如果你确实需要一个64位有符号整数,则可以使用int64_t


同意。但请尽可能少地使用xintX_t类型。如果代码移植到不太宽容的CPU架构上,这些类型会严重影响性能。 - wallyk
@wallyk:当然,由于对类型大小的假设不再成立而导致代码出现错误会更加糟糕,因此我宁愿冒着性能损失的风险来避免出现错误的代码(当然,代码不应该对类型的大小做出比标准保证更多的假设,但这种情况仍然经常发生)。 - Grizzly

1

现在越来越难预测什么更快,什么更慢。原因是处理器不再“简单”,所有复杂的动态和算法背后的最终速度可能遵循完全反直觉的规则。

唯一的出路就是测量和决策。还要注意的是,什么更快取决于微小的细节,即使对于兼容的CPU,一个优化对于一个CPU可能是一个劣化。对于非常关键的部分,一些软件只是尝试并检查运行时程序初始化期间不同方法的时间。

话虽如此,作为一般规则,您可以拥有更快的整数是int。只有在需要它们时才应使用其他整数(例如,如果long更大且需要更高的精度,则需要它们,或者如果short更小但足够并且需要节省内存)。

如果需要特定大小,则最好使用固定的标准类型或添加typedef,而不仅仅是在需要它的地方添加long。这样将更容易支持不同的编译器和架构,并且对于将来阅读代码的人来说,意图也将更清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接