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