什么时候应该使用C ++定宽整数类型,它们如何影响性能?

Neo*_*ana 10 c++ c++11

通常,我想大多数人会使用int所有内容,并且有时会unsigned int在需要时使用它们。short int有时您可能会使用,可能用于网络流量等。

但是最近我已经开始std::size_t用于索引STL容器(应该如此),然后我开始std::uint8_t在创建四个8位色值(RGBA)而不是a的结构时找到用处char,因为它可以对我来说更有意义(这是一个数字,不是字符类型,也不是8位值,它是0-255之间的8位数字)。

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

这使我逐渐开始在所有地方使用固定宽度类型。这使我真正考虑了我需要什么,需要多少范围等,不管它是否会变成负值。

所以现在,int我的代码中几乎没有零发生。

我认为这有三个原因:

  1. 这使我的意图清晰地传达给其他人(即,我不希望这个数字大于这个数字,否则它不会是负数)
  2. 代码更具可移植性。如果我想使用16位整数类型,则每个编译器将为16位
  3. 节省内存。尽管我认为在现代PC上这并不重要。

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

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

Jos*_*fer 4

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

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

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

  • 另一方面,您可以使用“int_fastXX_t”。 (4认同)
  • 答案对我来说有点短——到底会发生什么错误?Int16 如何导致速度变慢?有某种来源吗?让我澄清一下,我并不是说你错了,只是这些事情应该是答案的一部分。 (2认同)