这两者之间有什么区别呢?我知道 int32_t 无论在哪种环境下都恰好是32位,但是,正如其名所示它很快,那么相比于 int32_t,int_fast32_t 真的能更快多少呢?如果它明显更快的话,为什么会这样呢?
C语言是以一个理想化的、抽象的机器为基础来规定的。但现实世界中的硬件特性并不被语言标准所捕捉。而_fast
类型是类型别名,使得每个平台都能指定对于硬件而言“方便”的类型。
例如,如果有一个包含8位整数的数组,并且想要单独修改每一个整数,那么在当代桌面机器上处理这个任务将会非常低效。因为加载操作通常需要填充整个处理器寄存器,其宽度为32位或64位(即“机器字”)。所以许多已加载的数据最终被浪费掉了,更重要的是,您无法并行地加载和存储相邻两个数组元素,因为它们位于同一机器字中,因此需要按顺序进行加载-修改-存储。
_fast
类型通常与机器字一样宽,如果可行的话。也就是说,它们可能比您需要的宽度更宽,从而消耗更多的内存(因此更难缓存!),但是您的硬件可能能够更快地访问它们。但这完全取决于使用模式。(例如,int_fast8_t
数组可能是机器字的数组,对这样的数组进行紧密循环修改可能会显著地受益。)
唯一的方法是比较来找出是否有任何差异!
int32_t
是一个恰好为32位的整数。如果您想创建一个精确的内存布局,它非常有用。
int_fast32_t
是当前处理器中最大的“最快”整数类型,至少大于等于int32_t
。我不知道当前处理器(x86或ARM)是否真的会有增益。
但我可以举一个实际例子:我曾经使用过一款32位PowerPC处理器。当访问未对齐的16位int16_t
时,效率很低,因为它必须先在其32位寄存器中重新对齐。对于非内存映射数据,由于我们没有内存限制,使用int_fast16_t
(实际上是32位的int)更有效。
int_fast32_t
是可用的最快速、至少具有 32 位的带符号整数类型。 - Maroun