某些处理器在较小的数据类型上无法像在大型数据类型上那样高效地运行。例如,给定:
uint32_t foo(uint32_t x, uint8_t y)
{
x+=y;
y+=2;
x+=y;
y+=4;
x+=y;
y+=6;
x+=y;
return x;
}
如果y
是uint32_t
为ARM Cortex-M3的编译器可以简单地生成
add r0,r0,r1,asl #2 ; x+=(y<<2)
add r0,r0,#12 ; x+=12
bx lr ; return x
但既然y
是uint8_t
,编译器将不得不生成:
add r0,r0,r1 ; x+=y
add r1,r1,#2 ; Compute y+2
and r1,r1,#255 ; y=(y+2) & 255
add r0,r0,r1 ; x+=y
add r1,r1,#4 ; Compute y+4
and r1,r1,#255 ; y=(y+4) & 255
add r0,r0,r1 ; x+=y
add r1,r1,#6 ; Compute y+6
and r1,r1,#255 ; y=(y+6) & 255
add r0,r0,r1 ; x+=y
bx lr ; return x
“快速”类型的预期目的是允许编译器替换无法使用快速类型进行有效处理的较小类型。不幸的是,“快速”类型的语义说明得很差,从而又产生了一个模糊的问题,即将使用带符号数学还是无符号数学来评估表达式。
uint8_t
保证为8位,但uint_fast8_t
保证为> = 8位,非常像unsigned char
。