18

两者有什么区别?我知道无论环境如何,int32_t 都是 32 位,但是,顾名思义,它很快,与 int32_t 相比,int_fast32_t 真正快多少?如果它明显更快,那为什么会这样呢?

4

2 回答 2

27

C 是根据理想化的抽象机器来指定的。但是现实世界的硬件具有语言标准没有捕捉到的行为特征。这些_fast类型是类型别名,允许每个平台指定对硬件“方便”的类型。

例如,如果您有一个 8 位整数数组,并且想要单独改变每个整数,这在现代台式机上将是相当低效的,因为它们的加载操作通常想要填充整个处理器寄存器,即 32 或 64位宽(“机器字”)。所以大量加载的数据最终被浪费了,更重要的是,你不能并行加载和存储两个相邻的数组元素,因为它们存在于同一个机器字中,因此需要按顺序加载-修改-存储。

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

找出它是否有任何区别的唯一方法是比较!

于 2013-04-23T08:09:22.630 回答
9

int32_t是一个正好是 32 位的整数。例如,如果您想创建一个具有精确内存位置的结构,这很有用。

int_fast32_t是您当前处理器的“最快”整数,最终大于或等于int32_t. 我不知道当前处理器(x86 或 ARM)是否真的有好处

但我终于可以概述一个真实的案例:我曾经使用 32 位 PowerPC 处理器。当访问未对齐的 16bitsint16_t时,它必须首先在其 32bits 寄存器之一中重新对齐它们是低效的。对于非内存映射的数据,由于我们没有内存限制,使用起来效率更高int_fast16_t(实际上是 32bits int)。

于 2013-04-23T08:11:36.063 回答