标准为标准无符号类型提供以下最小位宽:
unsigned char >= 8
unsigned short >= 16
unsigned int >= 16
unsigned long >= 32
unsigned long long >= 64
(隐含地,通过指定最小最大值)。
这是否意味着以下等同?
unsigned char == uint_fast8_t
unsigned short == uint_fast16_t
unsigned int == uint_fast16_t
unsigned long == uint_fast32_t
unsigned long long == uint_fast64_t
答案 0 :(得分:3)
不,因为编译器选择默认“原始数据类型”的大小为给定系统的方便。方便的含义易于使用由于各种原因:整数范围,其他整数类型的大小,向后兼容性等。它不一定被选为最快的。
例如,实际上unsigned int
在32位系统上的大小为32,在64位系统上的大小为32。但在64位系统上,uint_fast32_t
可能是64位。
只需查看unsigned char
与uint_fast8_t
实践中最常用的尺寸:
Data bus unsigned char uint_fast8_t
8 bit 8 bit 8 bit
16 bit 8 bit 16 bit
32 bit 8 bit 32 bit
64 bit 8 bit 32/64 bit
就是这样,因为为方便起见,我们需要一个字节类型来处理。然而,优化编译器可能会将此unsigned char
字节放在对齐的地址并将其读取为32位访问,因此尽管数据类型的实际大小可能会执行优化。
答案 1 :(得分:1)
我不知道这是否是问题的答案,但(至少在glibc
),int_fastx_t
和uint_fastx_t
typedef
取决于单词尺寸:
/* Fast types. */
/* Signed. */
typedef signed char int_fast8_t;
#if __WORDSIZE == 64
typedef long int int_fast16_t;
typedef long int int_fast32_t;
typedef long int int_fast64_t;
#else
typedef int int_fast16_t;
typedef int int_fast32_t;
__extension__
typedef long long int int_fast64_t;
#endif
/* Unsigned. */
typedef unsigned char uint_fast8_t;
#if __WORDSIZE == 64
typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
#else
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
__extension__
typedef unsigned long long int uint_fast64_t;
#endif
答案 2 :(得分:0)
基本上你是对的,但不是法律上的。 int意味着"自然"系统的整数类型。实际上,它通常在32位和64位系统上为32位,在小型系统上为16位,因为64位整数会破坏太多接口。所以int本质上就是fast_32_t。 然而,它不能保证。而像8位和16位这样的较小类型可能具有更快的32位当量。但是在实践中使用int可能会给你最快的代码。