也许是性能?我觉得使用非固定整数只会使程序更复杂,并且在移植到另一个架构时容易失败。
4 回答
std::intN_t
仅当实现可以直接支持它们时才提供。所以移植使用它们的代码可能会失败。
我更喜欢std::intfastN_t
一般用途,因为它们的限制较少,并且应该与int
.
此外,大多数 C++ 代码在任何地方都使用,因此在将 a 传递给接受 a 的函数int
时,您可能会遇到提升怪异,特别是如果只有 16 位。std::int32_t
int
sizeof(int)
许多 API 接受或返回非固定类型的值。例如,文件描述符是 type int
,文件偏移量或大小是 typeoff_t
并strtol()
返回一个long
. 盲目地将这些值从固定大小类型转换为固定大小类型可能会导致某些机器上的溢出。
保证宽度类型 ( intN_t
) 只是适当“标准”整数类型的类型定义。如果平台没有合适的类型(例如,它使用 36 位整数),那么它不能也不能提供保证宽度的 typedef。这意味着性能很难成为一个论据。
最大可移植性(在这方面)的一般准则是默认使用“标准”整数类型,并且仅当您的算法需要精确的位数时才使用保证宽度类型。应该假设“标准”整数类型仅与相关标准所保证的一样宽(如果您只查看 C++ 标准,那将是: 8-bits char
、 16-bits int
、 32-bits long
,如果您的编译器支持它,64位long long
)。
如果您的数据类型的大小对其功能至关重要,那么您应该使用具有定义大小的类型。但是,例如一段代码完全在 [你可以合理预期的] int 范围内(例如 1 ... 1000 循环计数器),没有理由仅仅因为你想定义你的变量而使用 int_32t . 它适用于 16、32、64、36、18 或 49 位整数,都一样。所以让编译器选择最好的大小。
编译器可能会为固定大小的整数生成更糟糕的代码,这些代码不是架构的“最佳选择”。
显然,通过网络或文件呈现的任何数据都需要具有固定大小。同样,如果您的接口需要跨接口边界的二进制兼容性,那么使用定义的大小类型对于避免大小成为问题非常有用。