int32_t和int_fast32_t之间的区别

21

这两者之间有什么区别呢?我知道 int32_t 无论在哪种环境下都恰好是32位,但是,正如其名所示它很快,那么相比于 int32_t,int_fast32_t 真的能更快多少呢?如果它明显更快的话,为什么会这样呢?


8
int_fast32_t 是可用的最快速、至少具有 32 位的带符号整数类型。 - Maroun
2个回答

30

C语言是以一个理想化的、抽象的机器为基础来规定的。但现实世界中的硬件特性并不被语言标准所捕捉。而_fast类型是类型别名,使得每个平台都能指定对于硬件而言“方便”的类型。

例如,如果有一个包含8位整数的数组,并且想要单独修改每一个整数,那么在当代桌面机器上处理这个任务将会非常低效。因为加载操作通常需要填充整个处理器寄存器,其宽度为32位或64位(即“机器字”)。所以许多已加载的数据最终被浪费掉了,更重要的是,您无法并行地加载和存储相邻两个数组元素,因为它们位于同一机器字中,因此需要按顺序进行加载-修改-存储。

_fast类型通常与机器字一样宽,如果可行的话。也就是说,它们可能比您需要的宽度更宽,从而消耗更多的内存(因此更难缓存!),但是您的硬件可能能够更快地访问它们。但这完全取决于使用模式。(例如,int_fast8_t数组可能是机器字的数组,对这样的数组进行紧密循环修改可能会显著地受益。)

唯一的方法是比较来找出是否有任何差异!


12

int32_t是一个恰好为32位的整数。如果您想创建一个精确的内存布局,它非常有用。

int_fast32_t是当前处理器中最大的“最快”整数类型,至少大于等于int32_t。我不知道当前处理器(x86或ARM)是否真的会有增益。

但我可以举一个实际例子:我曾经使用过一款32位PowerPC处理器。当访问未对齐的16位int16_t时,效率很低,因为它必须先在其32位寄存器中重新对齐。对于非内存映射数据,由于我们没有内存限制,使用int_fast16_t(实际上是32位的int)更有效。


1
我认为将唯一感兴趣的点放在邪恶博士的引用中并不是非常有用的答案...“最快”是什么意思? - Kerrek SB
@KerrekSB:标准只是说“最快”,并注明“指定类型不能保证在所有情况下都是最快的;如果实现没有明确选择一个类型而不是另一个的理由,它将简单地选择满足有符号和宽度要求的某个整数类型。”因此,我认为引用很合适,因为每个实现者可以自由决定如何衡量“速度”。在64位实现中,“int_fast32_t”很容易是32位。 - Steve Jessop
抱歉,一场会议打断了我的回答写作。现在我完成了,还附上了一个有启发性的例子。 - Offirmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接