在ISO/IEC 9899:2018(C18)中,在7.20.1.3:

7.20.1.3最快的最小宽度整数类型

1以下类型中的每一个都指定在至少具有指定宽度的所有整数类型中操作通常最快的整数类型(268).

2 typedef名称int_fastN_t指定宽度至少为N的最快有符号整数类型.typedef名称uint_fastN_t指定宽度至少为N的最快无符号整数类型.

3需要以下类型:

int_fast8_t,int_fast16_t,int_fast32_t,int_fast64_tuint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t

此表单的所有其他类型都是可选的.


268)指定的类型不能保证在所有情况下都是最快的;如果实现没有明确的理由 Select 一种类型而不是另一种类型,那么它只会 Select 满足符号性和宽度要求的整数类型.


但是没有说明为什么这些"快速"整数类型更快.

  • 为什么这些快速整数类型比其他整数类型更快?

用C++来标记问题,因为快速整数类型也可在C++文件17中在cstdint的头文件中使用.不幸的是,在ISO/IEC 14882:2017(C++17)中,没有关于其解释的此类章节;我在问题的主体中以其他方式实施了该部分


信息:在C中,它们在stdint.h的头文件中声明.

推荐答案

想象一个只执行64位算术运算的CPU.现在想象一下如何在这样的CPU上实现无符号8位加法.为了得到正确的结果,它必然需要不止一次的操作.在这种CPU上,64位操作比其他整数宽度上的操作更快.在这种情况下,所有Xint_fastY_t可能都是64位类型的别名.

如果CPU支持窄整数类型的快速操作,因此较宽的类型不比较窄的类型快,那么Xint_fastY_t将(不应该)是较宽类型的别名,而不是表示所有Y位所需的别名.

出于好奇,我判断了一些体系 struct 上特定实现(GNU、Linux)的大小.在同一体系 struct 上的所有实现中,这些都不相同:

┌────╥───────────────────────────────────────────────────────────┐
│ Y  ║   sizeof(Xint_fastY_t) * CHAR_BIT                         │
│    ╟────────┬─────┬───────┬─────┬────────┬──────┬────────┬─────┤
│    ║ x86-64 │ x86 │ ARM64 │ ARM │ MIPS64 │ MIPS │ MSP430 │ AVR │
╞════╬════════╪═════╪═══════╪═════╪════════╪══════╪════════╪═════╡
│ 8  ║ 8      │ 8   │ 8     │ 32  │ 8      │ 8    │ 16     │ 8   │
│ 16 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 16     │ 16  │
│ 32 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 32     │ 32  │
│ 64 ║ 64     │ 64  │ 64    │ 64  │ 64     │ 64   │ 64     │ 64  │
└────╨────────┴─────┴───────┴─────┴────────┴──────┴────────┴─────┘

请注意,尽管对较大类型的操作可能会更快,但此类类型也会占用更多缓存空间,因此使用它们不一定会产生更好的性能.此外,人们不能总是相信实现从一开始就做出了正确的 Select .一如既往,需要测量才能获得最佳结果.


表格截图,面向Android用户:

Screenshot of above table

(Android在mono字体-ref中没有方框绘制字符)

C++相关问答推荐

segfault在C中使用getline()函数

错误:在.h程序中重新定义 struct

getchar读css + z还是返回css?

如何在C宏中确定Windows主目录?

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

C:fopen是如何实现二进制模式和文本模式的?

在C++中通过空指针隐式访问常量变量的值

C-使用指针返回修改后的整数数组

X64:并发写入布尔数组

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

编译器如何处理具有更复杂值的枚举?

在进程之间重定向输出和输入流的问题

错误...的多个定义(&Q)首先在这里定义&

Realloc():中止的下一个大小无效(核心转储)

如何组合两个宏来初始化C语言中的字符串数组?

向左移位3如何得到以字节为单位的位数?

Linux/C:带有子进程的进程在添加waitid后都挂起

`%%的sscanf无法按预期工作

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

为什么这里的符号没有解析?