gpt4 book ai didi

c++ - 为什么使用 std::next 而不是向指针添加一个整数?

转载 作者:可可西里 更新时间:2023-11-01 16:27:23 27 4
gpt4 key购买 nike

我只是有一个简短的问题。我无法弄清楚使用 std::next 与仅向指针添加所需数量的进步相比有什么好处。一个简单的例子:

 int main()
{
int arr [] = {1, 2, 3, 4, 5};
cout << *(arr + 2) << ", "; //example 1
cout << *std::next(arr, 2) << endl; //example 2
return 0;
}

输出:3, 3

从逻辑上讲,示例 1 应该更快,因为没有调用任何函数,等等。另外,在我运行这段代码的实例中,如果我添加了一个会导致指针越界的数字(例如 7) ,编译器会在示例 1 中抛出一个错误,但会很乐意继续并在示例 2 中给我一个内存地址。这与我最初的想法相矛盾:std::next 会给出某种如果指针超出范围,则发出警告或其他内容。

任何启发将不胜感激。

最佳答案

因为 std::next 的设计不仅适用于原始指针,而且适用于所有迭代器,因此它更加通用。

您的假设也是错误的。当使用合理的优化级别时,这两种方法很可能会产生相同的程序集。同样,c++ 旨在使此类优化更容易。在您的示例中,底层迭代器类型显然是原始指针,并且推断可以内联函数调用是非常简单的。

编辑:

正如 Matt 在他的评论中所说,迭代器不仅仅是一个奇特的名称和一个模板包装器。有些数据结构(容器)不驻留在连续的内存段中(例如 mapset),它们需要使用更多逻辑来确定确切的位置在内存中。迭代器也对此进行了包装,它们提供了算法和容器之间的抽象级别。

因此总结以上几点,使用标准习语有助于编写更健壮的代码,即支持不同类型的容器(不关心它们的内存布局),同时由于非常智能的编译器而尽可能保持效率。

关于c++ - 为什么使用 std::next 而不是向指针添加一个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126823/

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