什么是uint_fast32_t,为什么应使用它代替常规的int和uint32_t?


110

因此,typedef:ed原始数据类型的原因是抽象了低级表示并使其易于理解(uint64_t而不是long long类型,即8个字节)。

但是,uint_fast32_t具有相同typedefuint32_t。使用“快速”版本可以使程序更快吗?


long long可能不是8个字节,可能有1个字节(如果CHAR_BIT至少为64)或3738383个字节的long long。uint64_t也可以是1,2、4或8个字节,为此CHAR_BIT必须是64、3、16或8。
12431234123412341234123

Answers:


134
  • int在某些平台上可能只有16位。对于您的应用程序可能还不够。
  • uint32_t不保证存在。如果typedef实现具有正好为32位的无符号整数类型,则实现必须提供此选项。例如,有些具有9位字节,因此没有uint32_t
  • uint_fast32_t清楚说明您的意图:从性能的角度来看,这是至少 32位的类型,这是最好的。uint_fast32_t实际上可能是64位长。这取决于实现。

... uint_fast32_t具有与uint32_t... 相同的typedef

您正在寻找的不是标准。这是一个特殊的实现(BlackBerry)。因此,您无法从那里推论出uint_fast32_t总是与相同的推论uint32_t

也可以看看:


35
好答案。为了完整起见,也许也可以指出两者之间的差异uint_least32_tuint_fast32_t除了它偏爱较小的存储而不是速度之外,这是相同的。
戴蒙

2
为什么宽度至少为32位的最快整数大于32位?我一直以为,如果位数减少,CPU所需处理的位数就会减少,从而更快。我在这里想念什么?
Shane Hsu

12
@ShaneHsu:说一个64位的cpu将有一个64位的位求和器,它在一个周期中将64位的数字相加。您只需要处理32位数字就没关系,它不会比一个周期快。现在,尽管在x86 / amd64上不是这样,但32位整数甚至可能无法寻址。在这种情况下,对其进行处理需要额外的操作,才能从例如64位对齐的单元中提取32位。另请参阅链接的问题。编写C ++标准是为了使其可以在具有37位字的计算机上工作...因此根本没有32位类型。
Yakov Galka

42

区别在于它们的准确性和可用性。

这里的文档说:

无符号整数类型,其宽度分别恰好8、16、32和64位(仅在实现直接支持type时提供):

uint8_t
uint16_t
uint32_t
uint64_t

最快的无符号无符号整数类型,宽度分别至少为 8、16、32和64位

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

因此,非常明显的区别是这uint32_t是一种具有完全 32位的类型,并且实现只有在其具有恰好 32位的类型时才应提供它,然后可以将该类型的类型定义为uint32_t。这意味着,uint32_t可能会或可能不会使用

在另一方面,uint_fast32_t是具有类型至少 32位,这也意味着,如果一个实施方式可以的typedef uint32_tuint_fast32_t 如果它提供uint32_t。如果不提供uint32_t,则uint_fast32_t可以是至少具有32位的任何类型的typedef 。


3
但是,使uint_fast32_t比uint32_t更快的原因是什么?为什么更快?
毁灭者

2
@PravasiMeet:并非所有整数都以相同的方式访问。有些比其他更容易访问。更简单意味着更少的计算,更直接,从而可以更快地访问。现在uint32_t在所有系统上都是32位(如果存在),与拥有64位的系统相比可能并不快。 uint_fast32_t另一方面,至少 32位甚至可以是64位。
纳瓦兹

10
@Destructor:在某些处理器上,如果将变量存储在更长的寄存器中,则编译器可能必须添加额外的代码才能丢失任何额外的位。例如,如果uint16_t x;将其存储在ARM7-TDMI的32位寄存器中,则代码x++;可能需要评估为x=((x+1)<<16)>>16);。在用于该平台的编译器上,uint_fast16_t很可能将其定义为与之uint32_t避免的同义词。
超级猫

为什么[u]int_(fast|least)N_t还不可选?当然,不是标准要求所有架构都支持至少64位的原始类型吗?然而,措辞stdint.h暗示他们必须这样做。对我来说,我们一直在强制执行自1999年以来,即64位计算成为主流之前的几年-不用说落后于嵌入式体系结构(在许多情况下仍是当前)的滞后。对我来说,这似乎是一个很大的疏忽。
underscore_d

1
@underscore_d:没有特殊原因,例如,该标准不适用于具有16个字节数据RAM和256条指令空间的PIC12实现。这样的实现需要拒绝很多程序,但是这不应该阻止它以定义的方式表现其可以满足其需求的程序。
超级猫

4

当你#include inttypes.h在你的程序,你可以访问一堆为代表的整数不同的方式。

uint_fast * _t类型仅定义用于表示给定位数的最快类型。

这样考虑:定义一个类型变量,short并在程序中多次使用它,这是完全有效的。但是,您正在使用的系统使用type值可能会更快地工作int。通过将变量定义为type uint_fast*t,计算机可以简单地选择可以使用的最有效的表示形式。

如果这些表示之间没有区别,则系统选择所需的任何一种,并在整个过程中始终使用。


9
为什么是inttypes.h而不是stdint.h?似乎inttypes.h仅包含各种适度有用的绒毛,以及stdint.h的包含?
伦丁

@underscore_d我知道区别。但是,无论应用领域如何,谁在专业程序中使用stdio.h?
隆丁

@Lundin我不知道他们是谁,或者他们是否存在!我想这可能是有用的,以提供一个链接详细阐述了什么“温和有用绒毛”是;-)也许它会帮助人们认识到你是对的,他们并不需要它。
underscore_d

-1

请注意,快速版本可能大于32位。虽然fast int非常适合放在寄存器中并对齐等:但是,它将使用更多的内存。如果您有大量这样的数组,则由于更多的内存高速缓存命中率和带宽,您的程序将变慢。

我认为现代的CPUS不会从fast_int32中受益,因为通常在加载指令期间会发生32到64位的符号扩展,并且有一种“本机”整数格式更快的想法是过时的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.