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_t
、int_fast32_t
和 signed int __attribute__ ((__mode__ (__SI__)))
是一回事。有人可以确认吗?
如果是,为什么要这样做?为什么不直接使用 int32_t?
实际答案取决于您的实施。 typedef
s 的实际要点是让那些不得不关心微优化的程序员,比如选择一种整数类型而不是另一种,只是因为轻微的性能提升,仍然可以编写平台独立代码。 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 语言中用处不大,我可以继续详细说明,但您可能不在乎。)
我现在正在浏览 "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_t
、int_fast32_t
和 signed int __attribute__ ((__mode__ (__SI__)))
是一回事。有人可以确认吗?
如果是,为什么要这样做?为什么不直接使用 int32_t?
实际答案取决于您的实施。 typedef
s 的实际要点是让那些不得不关心微优化的程序员,比如选择一种整数类型而不是另一种,只是因为轻微的性能提升,仍然可以编写平台独立代码。 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 语言中用处不大,我可以继续详细说明,但您可能不在乎。)