C++:使用 std::uint_fastn_t 的缺点

问题描述

所以我偶然发现了 When should I use the C++ fixed-width integer types and how do they impact performance?Should I use cstdint?,其中列出了 <cstdint> 中定义的固定宽度整数类型的优缺点。

我有点喜欢将变量的预期范围编码为它的类型,但我也不想强制 cpu 执行额外的操作只是为了使用 uint16_t 而不是普通的 {{1}当我没有严格要求有一个恰好包含 16 位的变量时。

我还阅读了 int 等类型。根据我的理解,使用这种类型应该确保我能够在该变量中存储 16 位数字,但我永远不必为使用这种类型支付任何运行时惩罚,因为在每个架构上,例如std::uint_fast16_t 会更快,我会自动使用它。

这给我留下了一个问题:除了我真的需要一个精确位宽的变量的情况之外,使用 uint32_t 而不是 std::uint_fast16_t 有什么缺点吗?


编辑:这当然是假设内存消耗不是问题。如果是,我会改用 unsigned int

解决方法

使用 std::uint_fast16_t 而不是说 unsigned int 有什么缺点。

一个缺点:不确定类型由于做通常的促销活动。 uint16_fast_t 会转换为 signedunsigned 吗?

uint16_fast_t fa = 1;
unsigned un = 1;
int i;

fa some_operator i --> may result in an `int` or `uint16_fast_t`
un some_operator i --> result is unsigned.

歧义可能会对更复杂的方程和溢出行为产生负面影响。


IMO,uint16_fast_t 仅在狭窄的受控代码中有用,不适用于一般的性能改进。小心Is premature optimization really the root of all evil?

影响这个结论的因素有很多,但一般来说,为了性能,通常最好是为了清楚起见并输入 unsigned