【发布时间】:2016-07-09 18:05:12
【问题描述】:
在 C++11 中,我们提供了固定宽度的整数类型,例如 std::int32_t 和 std::int64_t,它们是可选的,因此对于编写跨平台代码不是最佳选择。然而,我们也得到了这些类型的非可选变体:例如“快速”变体,例如std::int_fast32_t和std::int_fast64_t,以及“最小尺寸”变体,例如std::int_least32_t,它们的大小都至少是指定的位数。
我正在编写的代码是基于 C++11 的跨平台库的一部分,它支持在最流行的 Unix/Windows/Mac 编译器上进行编译。现在出现的一个问题是,用 C++11 固定宽度整数类型替换代码中现有的整数类型是否有优势。
使用像std::int16_t 和std::int32_t 这样的变量的一个缺点是无法保证它们可用,因为只有在实现直接支持该类型时才提供它们(根据http://en.cppreference.com/w/cpp/types/integer)。
但是,由于int 至少有 16 位,而且 16 位对于代码中使用的整数来说已经足够大了,那么 std::int_fast16_t 在 int 上的用法呢?以这种方式将所有int 类型替换为std::int_fast16_t 并将所有unsigned int 替换为std::uint_fast16_t 是否有好处,或者这是否不必要?
同理,如果知道所有支持的平台和编译器都具有至少 32 位大小的 int,那么将它们分别替换为 std::int_fast32_t 和 std::uint_fast32_t 是否有意义?
【问题讨论】:
-
你的“缺点”似乎是基于一个假设。谁说
std::int16_t和std::int32_t可能会消失?毕竟,它们是标准所要求的。 -
如果您想确保您的 int 至少为 32 位宽,请执行此操作。普通
int不做这样的保证。 -
@GregHewgill 它们是可选的。我的意思是,如果它们以前在操作系统和编译器的未来版本中受到支持,它们可能不受支持。我不知道任何不提供 std::int16_t 和 std::int32_t 的操作系统和编译器,但由于它们仅在本机已经存在此大小的整数时才不是可选的,因此无法保证它们的存在。另请参阅:stackoverflow.com/questions/32155759/… 如果您了解更多,您可以在这里回答:)
-
未来很难预测。潜在地,一切都可以在新标准中“消失”。但实际上不太可能 :) 但是,
fast类型的好处是合理的 - 它们在 当前 版本中是强制性的。下一个标准可以使它们成为可选的吗?是的。但!它们不能保证有那么多位。它们可能更宽。 -
@GregHewgill - 它们是“可选的”,因为如果目标平台没有该大小的合理类型,它们就不需要存在。这在当今很不寻常,但整数类型没有内在的理由是 2 的幂;过去有些处理器的倍数是 9。在这样的平台上,
int16_t可能不存在,但int_fast16_t和int_least16_t会存在。