两者有什么区别?我知道无论环境如何,int32_t都是32位,但正如它的名字暗示它的速度快,int_fast32_t与int32_t相比要快多少?如果它明显更快,那么为什么呢?
答案 0 :(得分:19)
C是根据理想化的抽象机器指定的。但是,真实世界的硬件具有语言标准未捕获的行为特征。 _fast
类型是类型别名,允许每个平台指定对硬件“方便”的类型。
例如,如果你有一个8位整数数组并希望单独改变每个整数,那么在当代桌面机器上这将是相当低效的,因为它们的加载操作通常要填充整个处理器寄存器,这是32或64位宽(“机器字”)。因此,大量加载的数据最终会被浪费掉,更重要的是,您无法并行化两个相邻数组元素的加载和存储,因为它们存在于同一个机器字中,因此需要按顺序进行加载 - 修改 - 存储。
_fast
类型通常与机器字一样宽,如果可行的话。也就是说,它们可能比您需要的更宽,因此消耗更多内存(因此更难以缓存!),但您的硬件可能能够更快地访问它们。但这完全取决于使用模式。 (例如,一个int_fast8_t
数组可能是一个机器字数组,修改这样一个数组的紧密循环可能会有很大的好处。)
找出它是否有所作为的唯一方法是比较!
答案 1 :(得分:8)
int32_t
是一个正好是32位的整数。如果您想要创建一个具有精确内存位置的结构,这很有用。
int_fast32_t
是当前处理器的“最快”整数,最后大于或等于int32_t
。我不知道当前处理器(x86或ARM)是否真的有增益
但我最后可以概述一个真实案例:我曾经使用32位PowerPC处理器。当访问未对齐的16位int16_t
时,它必须首先在其32位寄存器之一中重新对齐它们是低效的。对于非内存映射数据,由于我们没有内存限制,因此使用int_fast16_t
(实际上是32位int)更有效。