gpt4 book ai didi

c++ - 数组索引类型 : signed/unsigned integer avantages

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:48 25 4
gpt4 key购买 nike

在 C++ 中,数组索引的默认大小是 size_t,它是大多数 x86-64 平台上的 64 位无符号 64 位整数。我正在为我的高性能计算库构建自己的 std::vector 类(主要原因之一是我希望此类能够取得指针的所有权,而 std::vector 没有提供)。对于数组索引的类型,我正在考虑使用:

  • size_t
  • 我自己的 index_t 是一个signed 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 使用无符号整数,因为它似乎带来了很多痛苦,而只有很少的优势。

最佳答案

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

关于c++ - 数组索引类型 : signed/unsigned integer avantages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26650863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com