c++ - 在新代码中,为什么要使用 `int` 而不是 `int_fast16_t` 或 `int_fast32_t` 作为计数变量?

标签 c++ c++11 int

如果您需要一个计数变量,那么您的整数肯定必须有一个上限和下限。那么为什么不通过选择适当的 (u)int_fastxx_t 数据类型来指定这些限制呢?

最佳答案

最简单的原因是人们更习惯于 int,而不是 C++11 中引入的附加类型,并且它是语言的“默认”整数类型(C++ 有一个);该标准在 [basic.fundamental/2] 中规定:

Plain ints have the natural size suggested by the architecture of the execution environment46; the other signed integer types are provided to meet special needs.

46) that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header <climits>.


因此,每当需要通用整数时,不需要具有特定范围或大小,程序员往往只使用 int 。虽然使用其他类型可以更清楚地传达意图(例如,使用 int8_t 表示该值不应超过 127 ),但使用 int 还传达了这些细节对手头的任务并不重要,同时提供了一些捕捉的余地超出您所需范围的值(例如,如果系统使用模运算处理有符号溢出,int8_t 会将 313 视为 57 ,从而使无效值更难以排除故障);通常,在现代编程中,它要么表示该值可以用系统的字长(int 应该表示的)表示,要么表示该值可以用 32 位表示(这几乎总是 x86 上 int 的大小)和 x64 平台)。
大小类型也有一个问题,即(理论上)最著名的 intX_t 行仅在支持正好 X 位大小的平台上定义。虽然保证在所有平台上都定义了 int_leastX_t 类型,并且保证至少为 X 位,但如果不需要,很多人不会想要输入那么多,因为它会在您需要时加起来经常指定类型。 [您不能使用 auto ,要么是因为它将整数文字检测为 int s。这可以通过使用用户定义的文字运算符来缓解,但这仍然需要更多的时间来输入。] 因此,如果这样做是安全的,他们通常会使用 int
或者简而言之,int 旨在成为正常操作的首选类型,而其他类型旨在用于超常情况。许多程序员出于习惯坚持这种心态,并且仅在明确要求特定范围和/或大小时才使用大小类型。这也相对较好地传达了意图; int 表示“数字”,intX_t 表示“始终适合 X 位的数字”。
由于 32 位和 64 位平台通常都使用 32 位 int ,因此 int 已经演变为非官方的意思是“32 位整数”,这无济于事。许多程序员很可能希望 int 在现代始终至少是 32 位,以至于如果他们必须为不支持 32 位 int 的平台编程,很容易在后面咬他们.

相反,当明确需要特定范围或大小时,通常使用大小类型,例如在定义需要在具有不同数据模型的系统上具有相同布局的 struct 时。在内存有限的情况下,使用可以完全包含所需范围的最小类型,它们也可以证明是有用的。
例如,打算在 16 位和 32 位系统上具有相同布局的 struct 将使用 int16_tint32_t 而不是 int ,因为 int 在大多数 16 位数据模型和 LP32 32 位数据模型中是 16 位(由 Win16 API 和 Apple Macintoshes 使用),但在 ILP32 32 位数据模型中为 32 位(由 Win32 API 和 *nix 系统使用,有效地使其成为事实上的“标准”32 位模型)。
类似地,打算​​在 32 位和 64 位系统上具有相同布局的 struct 将在 int 上使用 int32_t/long longint64_t/long ,因为 long 在不同模型中具有不同的大小(LP64 中的 64 位(由 64 位使用) *nix)、LLP64 中的 32 位(由 Win64 API 使用)和 32 位模型)。
注意还有第三个 64 位模型,ILP64,其中 int 是 64 位;这个模型很少使用(据我所知,它只在早期的 64 位 Unix 系统上使用),但如果需要与 ILP64 平台的布局兼容性,它将强制使用 int 上的大小类型。

关于c++ - 在新代码中,为什么要使用 `int` 而不是 `int_fast16_t` 或 `int_fast32_t` 作为计数变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43441579/

相关文章:

C++ std lib <mutex>, <conditional_variable> 库和共享内存

C++ 将一组值映射到类型

C++从具有相同名称的成员的基类多重继承

c - 将 int 拆分为单个数字。如何处理零

c++ - 自己的lib,另一台电脑: cannot open shared object file: No such file or directory

c++ - 我可以为一个类同时编写复制和 move 赋值运算符吗?

C# int、Int32 和枚举

将多位整数从 char 数组转换为整数

c++ - ARM C++ ABI : Constructor/destructor return values

c++ - += 运算符在 C++ 中是如何实现的?