似乎uint32_tuint_fast32_t更普遍(我意识到这是轶事证据).不过,这似乎与我的直觉背道而驰.

几乎总是当我看到一个实现使用uint32_t时,它真正想要的是一个整数,可以容纳高达4294967295的值(通常是65535和4294967295之间的一个更低的界限).

It seems weird to then use uint32_t, as the 'exactly 32 bits' guarantee is not needed, and the 'fastest available >= 32 bits' guarantee of uint_fast32_t seem to be exactly the right idea. Moreover, while it's usually implemented, uint32_t is not actually guaranteed to exist.

那么,为什么uint32_t人会更受欢迎呢?它只是更为人所知,还是有技术优势?

推荐答案

保证uint32_t在任何支持它的平台上具有几乎相同的属性.1

相比之下,uint_fast32_t几乎不能保证它在不同系统上的行为.

如果切换到uint_fast32_t具有不同大小的平台,则所有使用uint_fast32_t的代码都必须重新测试和验证.所有的 solidity 假设都将被抛诸脑后.整个系统将以不同的方式工作.

在编写代码时,您甚至可能没有不是32位大小的accessuint_fast32_t个系统.

uint32_t不会有什么不同(见脚注).

正确性比速度更重要.因此,过早的正确性是比过早的优化更好的计划.

如果我为uint_fast32_t是64位或更多位的系统编写代码,我可能会在这两种情况下测试我的代码并使用它.除非需要和机会并存,否则这样做是一个糟糕的计划.

最后,由于缓存大小问题和内存带宽的原因,当您存储它的时间长度或实例数量都不限时,uint_fast32_t可能会比uint32慢.今天的计算机通常是内存受限的,而不是CPU受限的,单独使用uint_fast32_t可能会更快,但考虑到内存开销后就不会了.


1正如@chux在 comments 中所指出的,如果unsigned大于uint32_t,则uint32_t上的算术将通过通常的整数提升,如果不是,则保持为uint32_t.这可能会导致错误.没有什么是完美的.

C++相关问答推荐

在32位处理器上优化53—32位模计算>

无效指针值在函数调用之间莫名其妙地改变

C语言编译阶段与翻译阶段的关系

使用双指针动态分配和初始化2D数组

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

Kdb:仅升级指定的列

在创建动态泛型数组时,通过realloc对故障进行分段

Boyer Moore算法的简单版本中的未定义行为

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

将数组插入数组

我在C程序的Flex/Bison中遇到语法错误

如何在MSVC中使用intSafe.h函数?

哪些C++功能可以在外部C块中使用

atoi函数最大长-长误差的再创造

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

无法理解 fgets 输出

如何用用户输入的多个字符串填充数组?

快速准确计算double的小数指数

用于内存布局的size命令(文本、数据、bss)