何时应使用 C++ 固定宽度整数类型,它们如何影响性能?



通常我想大多数人会使用int做所有事情,偶尔他们会在需要时使用unsigned int。时不时地你可能会使用short int,也许是为了网络流量或其他什么。

但是最近我开始使用std::size_t索引到 STL 容器中(我应该这样做),然后在创建四个 8 位颜色值 (RGBA) 的结构时,我开始发现std::uint8_t的用途,而不是char,仅仅是因为它对我来说更有意义(它是一个数字,而不是字符类型, 而不是 8 位值,而是 0-255 之间的 8 位数字)。

然后在进行一些网络编程时,我发现我想确保传递的某些值是 16 位的。根据 https://en.cppreference.com/w/cpp/language/types 我不能假设short int是 16 位,只能假设它至少是 16 位。所以我找到了std::int16_t的用途.

这导致我逐渐开始在任何地方使用固定宽度的类型。这让我真正思考我需要什么,我需要多少范围等,它是否会落入负值。

所以现在,我的代码中几乎没有出现int

我脑子里有三个原因:

  1. 它向其他人表明了我的意图(即,我不希望数字大于此数字,否则不会为负数)
  2. 代码更具可移植性。如果我想要一个 16 位整数类型,它在每个编译器上都是 16 位
  3. 节省内存。虽然我想在现代PC上这在很大程度上并不重要。

但我担心这会降低性能,因为您通常的消费级 CPU 会在本机宽度类型上运行,例如std::int32_t更好。

那么,何时应使用固定宽度类型,它们如何影响性能?

在编写可移植代码时,您应该使用int(除非整数大小受到外部因素(例如协议解析)的限制),因为这将允许机器使用该机器上首选(最佳)的整数大小。

例如,有许多正在使用的微处理器,其寄存器大小为16位; 他们提供的编译器标头将sizeof(int)设置为 2。 使用例如 在这些机器上进行算术int32_t会产生很多额外的指令。

但是:对于索引,使用int是一个坏主意:最好使用 intsize_t,即使保证不会使用 int 使索引溢出。 这是因为该值可能需要转换为索引寄存器大小(例如,size_t为 64 位,int为 32 位)。 这在内循环中可能代价高昂。

最新更新