根据在线文档,这些固定宽度整数类型之间存在差异。因为int*_t
我们将宽度固定为 的值*
。然而对于其他两种类型,描述中使用了形容词最快和最小来请求底层数据模型提供的最快或最小的实例。
“最快”或“最小”的客观含义是什么?什么是有利甚至必要的例子?
根据在线文档,这些固定宽度整数类型之间存在差异。因为int*_t
我们将宽度固定为 的值*
。然而对于其他两种类型,描述中使用了形容词最快和最小来请求底层数据模型提供的最快或最小的实例。
“最快”或“最小”的客观含义是什么?什么是有利甚至必要的例子?
“最快”没有客观意义;它基本上是编译器编写者的判断调用。通常,这意味着将较小的值扩展到体系结构的本机寄存器宽度,但这并不总是最快的(例如,如果它是 8 位值,则可能会更快地处理 10 亿个条目数组,但uint_fast8_t
可能是 32 位值,因为 CPU该大小的寄存器操作速度更快)。
“最小”通常意味着“与请求的位大小相同”,但在具有有限大小值可供选择的奇怪架构上(例如,旧的 Crays 将所有内容都作为 64 位类型),int_least16_t
可以工作(并且无缝地变成 64 位值) ,而编译器可能会出错int16_t
(因为不可能在那里生成真正的 16 位整数值)。
关键是,如果您依赖溢出行为,则需要使用精确的固定宽度类型。否则,您可能应该默认使用least
类型以获得最大的可移植性,切换到fast
热代码路径中的类型,但需要进行分析以确定它是否真的有任何区别。