在C++中,数组索引的默认大小是size_t,在大多数x86-64平台上它是一个64位的无符号整数。我正在构建自己的std::vector类用于我的高性能计算库(其中一个主要原因是我希望这个类能够占据指针的所有权,而std::vector没有提供这个功能)。对于数组索引的类型,我考虑使用以下两种之一:
- size_t
- 我的自定义index_t类型,它将是一个有符号的int或long signed 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
当使用带符号整数时,a < b 可以被缩小到一个更小的值(溢出是未定义的),而无符号整数不行。性能方面唯一的优势似乎是对于无符号整数,a /= 2可以缩减为位移操作,但对于带符号整数则不行。
我想知道C++委员会为什么决定将size_t用作无符号整数,因为它似乎引入了很多麻烦,而只有很少的优势。
i < v.size()
在这里会起作用。否则,如果您想要一个有符号类型来进行这样的操作,请选择ptrdiff_t
,这是正确的类型,用于编码差异。也许您会发现这很有趣,它主要涉及 C 语言,但在这里两者紧密联系。http://gustedt.wordpress.com/2013/07/15/a-praise-of-size_t-and-other-unsigned-types/. 噢,还有投票关闭,因为这主要是基于个人观点的。 - Jens Gustedt