【发布时间】:2020-04-22 21:37:47
【问题描述】:
在 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_t,uint_fast8_t、uint_fast16_t、uint_fast32_t、uint_fast64_t此表单的所有其他类型都是可选的。
268) 不保证指定的类型在所有用途中都是最快的;如果实现没有明确的理由选择一种类型而不是另一种,它将简单地选择一些满足符号和宽度要求的整数类型。
但没有说明为什么这些“快速”整数类型更快。
- 为什么这些快速整数类型比其他整数类型更快?
我用 C++ 标记了这个问题,因为在 cstdint 的头文件中的 C++17 中也提供了快速整数类型。不幸的是,在 ISO/IEC 14882:2017 (C++17) 中没有关于它们的解释的部分;我已经在问题正文中实现了该部分。
信息:在C语言中,它们在stdint.h的头文件中声明。
【问题讨论】:
-
这里的关键点是这些整数类型不是独立的,神奇地更快的类型。它们只是该机器上该操作最快的任何正常现有类型的别名。
-
编译器发出 CPU 操作操作码来加载、存储、屏蔽和修改特定大小的内存位置和寄存器;这就是 CPU 看到的所有内容。操作系统与它无关。这都是编译器在做的,就像你自己指定了给定的 typedef 一样。 (我假设编译器可以在内部以不同的方式处理它——如果可能的话,可能比用户 typedef 更有效——只要行为上没有明显的差异。)
-
@RobertS-ReinstateMonica 准确地说,这些“别名”只是
typedef语句。所以通常是在标准库级别完成的。当然,C 标准对typedef的用途没有真正的限制——例如,一个典型的实现是在 32 位系统上使int_fast32_t成为typedef或int,但假设编译器 可以 例如实现一个__int_fast内在类型并承诺做一些花哨的优化来根据具体情况为该类型的变量选择最快的机器类型,然后库可以只是@ 987654339@ 到那个。 -
@RobertS-ReinstateMonica 是的,是的。您可以使用特定于架构的编译标志获得最高性能的程序,从而降低二进制文件的可移植性。
-
@RobertS-ReinstateMonica 在编译它for的平台上效率最高,不一定on。
标签: c++ c performance types int