intXX_t和int_fastXX_t有什么区别?
我最近发现了标准最快types的存在,主要是int_fast32_t和int_fast64_t 。
我总是被告知,为了在主stream架构上正常使用,最好使用经典的int & long ,它应该总是适合处理器默认的读取能力,这样可以避免无用的数值转换。
在C99标准中,它在§7.18.1.3p2中说:
“typedef名称int_fastN_t指定宽度至less为N的最快有符号整数types。typedef名称uint_fastN_t指定宽度至less为N的最快无符号整数types。
而且在§7.18.1.3p1中也有关于它的引用:
“对于所有目的,指定types不保证是最快的;如果实现没有明确的select一种types的理由,它只会select一些符合签名和宽度要求的整数types。
我不清楚什么最快的真正意义。 我不明白什么时候应该使用这种types,什么时候不应该使用。
我在这个上搜了一下,发现一些开源 项目已经把它们的一些function改变了,但并不是全部。 他们并没有真正解释为什么他们改变了一部分代码,而只是代码的一部分。
你知道什么是int_fastXX_t 真的比经典的更快吗?
在C99标准中,7.18.1.3最快的最小宽度整数types。
(7.18.1.3p1)“以下每种types都指定一个通常最快的整数types225),以便在至less具有指定宽度的所有整数types中进行操作。
“(第225页)”指定types不能保证在所有目的中最快;如果实现没有明确的select一种types的理由,它只会select一些符合签名和宽度要求的整数types。
和
(7.18.1.3p2)“typedef名称int_fastN_t指定宽度至less为N的最快有符号整数types。typedef名称uint_fastN_t指定宽度至less为N的最快无符号整数types。
typesint_fastN_t
和uint_fastN_t
与精确宽度的整数typesintN_t
和uintN_t
。 实现保证它们至less需要N
位,但是如果可以使用更大的types执行优化,则实现可以占用更多的位; 它只是保证他们至less需要N
位。
例如,在一个32位的机器上, uint_fast16_t
可以被定义为一个unsigned int
而不是一个unsigned short
因为使用机器字大小的types会更有效率。
它们存在的另一个原因是精确宽度的整数types在C中是可选的,但是需要最快的最小宽度整数types和最小宽度整数types( int_leastN_t
和uint_leastN_t
)。
除了int32_t
和int16_t
甚至不存在的外来硬件外,可能没有什么区别。
在这种情况下,可以使用int_least16_t
来获取可以包含16位的最小types。 如果你想节约空间可能是重要的。
另一方面,使用int_fast16_t
可能会得到另一个types,比int_least16_t
但对于“典型”整数使用可能会更快。 实施将不得不考虑什么是更快,什么是典型的。 也许这对于一些特殊用途的硬件是显而易见的
在大多数常见的机器上,这些16位types都将是一个short
的typedef,你不必费心。
Gnu libc在编译64位CPU时定义 {int,uint} _fast {16,32} _t为64位,否则为32位。 Intel和AMD 64位x86 CPU上的64位整数操作比32位整数上的操作要快。
海事组织他们是毫无意义的。
编译器不关心你称为什么types,只是它的大小和适用于它的规则。 所以如果int,in32_t和int_fast32_t在你的平台上都是32位,那么他们几乎肯定会执行相同的操作。
理论上说,语言的实现者应该根据硬件上最快的部分来select,但是标准的作者从来没有把最快的明确的定义固定下来。 再加上这个事实,平台维护者不愿意改变这些types的定义(因为这将是一个ABI中断),并且定义最终在平台生命的开始时被挑选出来(或者从C库inheritance的其他平台移植到)并且再也没有碰过。
如果您处于微观优化水平,您认为可变大小可能会产生显着差异,那么请使用处理器上的代码对不同选项进行基准testing。 否则别担心。 “快”types不添加任何有用的国际海事组织。