avr-gcc 库中 typedef int16_t int_fast16_t 的用途

Purpose of typedef int16_t int_fast16_t in avr-gcc library

我现在正在浏览 "Arduino\hardware\tools\avr\avr\include" 文件夹中的 avr 库。 stdint.h 文件中有一段代码:

typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__)));
typedef signed int int32_t __attribute__ ((__mode__ (__SI__)));

typedef uint16_t uint_fast16_t;

/** \ingroup avr_stdint
    fastest signed int with at least 32 bits. */

typedef int32_t int_fast32_t;

所以基本上 int32_tint_fast32_tsigned int __attribute__ ((__mode__ (__SI__))) 是一回事。有人可以确认吗?

如果是,为什么要这样做?为什么不直接使用 int32_t?

实际答案取决于您的实施。 typedefs 的实际要点是让那些不得不关心微优化的程序员,比如选择一种整数类型而不是另一种,只是因为轻微的性能提升,仍然可以编写平台独立代码。 signed int __attribute__ ((__mode__(__SI__))) 可能是一个平台上性能最好的整数类型,但一旦决定支持另一个平台,就会有成千上万的类型,必须更改。

我理解问题是 "Why does stdint.h declare types with names like int_leastN_t and int_fastN_t as well as the intN_t that I expect it to declare?"

简单的答案是,C 标准(自 1999 年修订以来)要求 stdint.h 声明这些类型,因为委员会认为它们很有用。碰巧的是,他们错了。几乎没有人想要 stdint.h 精确宽度类型。但是一旦包含在 C 标准中,就很少会从 C 标准中删除,因为这会破坏 正在 使用它们的程序。所以 stdint.h 可能会永远继续声明这些类型。

(关于 为什么 非精确宽度类型在 C 语言中用处不大,我可以继续详细说明,但您可能不在乎。)