什么是uint_fast32_t以及为什么要使用它来代替常规int和uint32_t?

Amu*_*umu 99 c c++ types

因此,对于其原因typedef:ED原始数据类型是抽象低级别表示,并使其更容易理解(uint64_t而不是long long类型,这是8个字节).

但是,有uint_fast32_t与之相同typedefuint32_t.使用"快速"版本会使程序更快吗?

ybu*_*ill 118

  • int在某些平台上可能只有16位.它可能不适合您的应用程序.
  • uint32_t不保证存在.typedef如果它具有正好为32位的无符号整数类型,则实现必须提供它是可选的.例如,有些字节具有9位字节,因此它们没有uint32_t.
  • uint_fast32_t清楚地陈述你的意图:它是一种至少 32位的类型,从性能的角度来看是最好的.uint_fast32_t事实上可能是64位长.这取决于实施.

...有uint_fast32_tuint32_t... 相同的typedef ...

你所看到的不是标准.这是一个特定的实现(BlackBerry).所以你不能从那里推断出uint_fast32_t总是相同的uint32_t.

也可以看看:

  • 好答案.为了完整性,我们也可以指出与uint_least32_t`的区别,这与`uint_fast32_t`相同,除了它有利于较小的存储而不是速度. (26认同)
  • @ShaneHsu:假设一个64位的cpu将有一个64位的夏天,它在一个周期内总计64位数.如果你想要做的就是处理32位数字并不重要,它不会比一个周期更快.现在,虽然在x86/amd64上不是这样,但32位整数可能无法寻址.在这种情况下,处理它们需要额外的操作来从例如64位对齐的单元中提取32位.另见相关问题.编写C++标准,以便它可以在具有37位字的机器上工作......因此根本没有32位类型. (8认同)
  • 为什么宽度至少为 32 位的最快整数会大于 32 位?我一直认为如果位数较少,CPU 必须处理的位数就会减少,因此速度会更快。我在这里缺少什么? (2认同)

Naw*_*waz 34

不同之处在于它们的准确性和可用性.

这里的文件说:

无符号整数类型,宽度分别为8,16,32和64位(仅当实现直接支持该类型时提供):

uint8_t
uint16_t
uint32_t
uint64_t
Run Code Online (Sandbox Code Playgroud)

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

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    
Run Code Online (Sandbox Code Playgroud)

所以差别非常明显,这uint32_t是一个具有精确 32位的类型,并且实现应该只在它具有正好 32位的类型时才提供它,然后它可以将typedef类型为uint32_t.这意味着,uint32_t可能会或可能不会使用.

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

  • @Destructor:在某些处理器上,如果变量存储在一个更长的寄存器中,编译器可能必须添加额外的代码来丢弃任何额外的位.例如,如果`uint16_t x;`存储在ARM7-TDMI上的32位寄存器中,则代码`x ++;`可能需要被评估为`x =((x + 1)<< 16)>> 16);`.在该平台的编译器上,`uint_fast16_t`很可能被定义为与`uint32_t`同义,以避免这种情况. (7认同)
  • 但是,例如 uint_fast32_t 比 uint32_t 快的原因是什么?为什么它更快? (4认同)
  • @PravasiMeet:并非所有以相同方式访问的整数.有些比其他人更容易访问.更简单意味着更少计算,更直接,从而更快地访问.现在`uint32_t`在所有系统上都是32位(如果存在),与64位的系统相比可能不会更快.另一方面,`uint_fast32_t`**至少**32位,甚至可以是64位. (2认同)

Har*_*man 5

当你#include inttypes.h在你的程序中时,你可以使用一系列不同的方式来表示整数。

uint_fast*_t 类型只是定义了表示给定位数的最快类型。

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

如果这些表示之间没有区别,则系统会选择它想要的任何一种,并始终一致地使用它。

  • 为什么是 inttypes.h 而不是 stdint.h?似乎 inttypes.h 只包含各种稍微有用的绒毛,加上 stdint.h 的包含? (10认同)