VC++ 标准库 - int_fast16_t和uint_fast16_t可能的编译器数据类型声明错误

VC++ Standard Lib - possible compiler datatype declaration error for int_fast16_t and uint_fast16_t

提问人:Walter 提问时间:9/16/2023 最后编辑:Eric PostpischilWalter 更新时间:9/16/2023 访问量:51

问:

在构建下面的表格并将鼠标悬停在未标记的 std::int_fast16_t 和 std::uint_fast16_t 上时,我发现它们被声明为 int 和 unsigend int,而不是 short 和 unsigned short。对于表中的所有其他数据类型,声明符合预期。

我使用的是最新版本的 Visual Studio。它可能是 VC C++ 标准库实现错误或智能感知问题。谁能确认。

要重现,只需键入 : std::int_fast16 或 std::uint_fast16 并使用鼠标指针将鼠标悬停在它上面。

//std::int8_t                           :  8 bits       : signed char, char
//      std:int_fast8_t
//      std::int_least8_t
//std::uint8_t                          :  8 bits       : unsigend char
//      std::uint_fast8_t
//      std::uint_least8_t
//std::int16_t                          : 16 bits       : signed short, short
//      std::int_fast16_t                               : <<<< int 32 bit !!! <<<<<<<
//      std::int_least16_t
//std::uint16_t                         : 16 bits       : unsigned short
//      std::uint_fast16_t                              : <<<< unsigned int 32 bit !!! 
//      std::uint_least16_t
//std::int32_t                          : 32 bits       : signed int, int
//      std::int_fast32_t
//      std::int_least32_t
//std::uint32_t                         : 32 bits       : unsigned int
//      std::uint_fast32_t
//      std::uint_least32_t
//std::int64_t                          : 64 bits       : signed long long, long long
//      std::int_fast64_t
//      std::int_least64_t
//std::uint64_t                         : 64 bits       : unsigned long long
//      std::uint_fast64_t
//      std::uint_least64_t
C 可视化-C++ C ++-标准库

评论

0赞 Hans Passant 9/16/2023
16 位整数类型在 32 位和 64 位处理器上速度不快。
0赞 Yunnosch 9/16/2023
您标记 C 的原因是什么?第二语言是怎么来的?
0赞 BoP 9/16/2023
在 32 位和 64 位 x86 代码中,16 位操作数需要大小覆盖前缀。这使得机器代码更长。因此,使用 an 而不是 a 会导致代码更小,这可能会执行得更快。这是他们的解释(标准没有具体说明这些类型应该“快速”什么)。intshortfast16
1赞 Walter 9/16/2023
@Yunnosh,C++的原语是用 C 的原语声明的。
2赞 Richard Critten 9/16/2023
uint_fast16_t - “宽度至少为 16 位的最快无符号整数类型”en.cppreference.com/w/cpp/types/integer

答:

1赞 user17732522 9/16/2023 #1

这是有意为之的。 应该是任何至少具有位宽的有符号/无符号整数类型,并且是底层体系结构中性能最高的此类类型。不能保证它们正好是 16 位宽。那将是.(u)intXX_fast_tXX(u)intXX_t

short非常像 16 位宽和 16 位宽类型在 x86/x86-64 CPU 上性能较低,可能大多数其他 32 位或 64 位架构也是如此。

(当然,性能是相对的,由 C++ 实现来决定它的确切含义。例如,如果程序受到 RAM 吞吐量的限制,那么无论 CPU 是否更容易对该类型进行单个操作,较小的类型都会使它受益。