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