数组索引的类型:有符号/无符号整数优势

时间:2014-10-30 10:42:03

标签: c++ c

在C ++中,数组索引的默认大小是size_t,在大多数x86-64平台上是64位 unsigned 64位整数。我正在为我的高性能计算库构建我自己的std :: vector类(其中一个主要原因是我希望这个类能够获取指针的所有权,std :: vector不会提供)。对于数组索引的类型,我想要使用:

  • 为size_t
  • 我自己的index_t将是签名的 int或长签名的int,具体取决于我的程序

优点或使用有符号整数优于无符号整数,例如

for (index_t i = 0; i < v.size() - 1; ++i)

就像是支持者一样(使用无符号整数,当v的大小为0时,这个循环会变得疯狂)

for (index_t i = v.size() - 1; i >= 0; --i)

应该像它应该的那样,以及许多其他的优点。

在性能方面,它甚至看起来更好一些
a + 1 < b + 1

可以减少到&lt; b带有符号整数(溢出未定义),而不是无符号整数。唯一的优势表现似乎是a / = 2可以简化为无符号整数的移位操作,但不能用带符号的整数。

我想知道为什么C ++委员会决定为size_t使用 unsigned 整数,因为它似乎引入了很多痛苦而且只有很少的优点。

2 个答案:

答案 0 :(得分:4)

使用无符号类型作为索引或大小的动机 该标准基于仅与16位相关的约束 机器。 C ++中任何整数类型的自然类型是 int,这应该是应该使用的;就像你一样 注意到,尝试在C ++中使用无符号类型作为数值 充满了问题。如果你担心尺寸 如此之大,以至于它们不适合intptrdiff_t 是合适的;毕竟,这就是它的类型 指针或迭代器的减法结果。 (事实是这样的 v.size()的类型与v.end() - v.begin()不同 真的是标准库中的设计缺陷。)

答案 1 :(得分:3)

对我来说,无符号大小总是最有意义,因为你不能在数组中有-32个元素,将大小/长度一直视为有符号数量是非常可怕的。

您提到的角落案例可以编码,您可以例如如果v对于第一种情况为空(它看起来不常见,迭代除了最后一种情况之外的所有元素?),则在输入之前中止循环。