【问题标题】:Is it faster to pass the pointer to a vector than the vector itself?将指针传递给向量是否比向量本身更快?
【发布时间】:2021-10-05 05:37:08
【问题描述】:

在我的程序中,我有一个将多个向量作为参数的函数。我曾经将它们作为法线向量传递,所以函数的定义是这样开始的:

void do(std::vector<int> a, std::vector<int> b, std::vector<int> c){

调用看起来像这样:

do(d, e, f);

但我希望我的代码尽可能快,所以我想知道是否不传递向量而是传递指向向量的指针会更快。所以函数的定义看起来像这样:

void do(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c){

还有这样的调用:

do(&d, &e, &f);

此更改是否会对性能产生影响?如果是:正面或负面,如果我的向量只包含 3 个元素,会有很大的不同吗?

【问题讨论】:

  • 你有正确的想法,但在这种情况下更喜欢引用而不是指针。
  • 如果vectors 不会被do 更改,请通过const 引用传递它们(const std::vector&lt;int&gt; &amp;a)如果你总是从你能做的最高限制开始使用对象,编译器可以更轻松地为您挑选错误。加上使用限制通常会使编译器更容易优化。
  • do 函数中,你如何处理你传入的那些向量?你还在函数内部复制它们吗?此外,do 是 C++ 中的关键字。你不想调用你的函数do
  • 这能回答你的问题吗? How to pass objects to functions in C++?

标签: c++ vector parameter-passing


【解决方案1】:

在优化方面,您应该避免按值传递复杂类型。始终使用指针或引用。正如我们在示例中看到的,按值传递要慢得多。

示例:https://quick-bench.com/q/C7732NYi7-gh0PgleKAGo8qmKZA

【讨论】:

    【解决方案2】:

    考虑 C++ 核心指南F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to const

    什么是便宜的,什么是通过副本传递的昂贵取决于一些因素。一个好的经验法则是传递任何与指针一样大或更小的值,以及任何更大的引用。 std::vector 当然最好通过 const 引用而不是复制。

    当传递 nullptr 是有效参数时,您应该只传递指针而不是引用。当调用者应该总是传递一个向量而不是一个向量时,那么你应该更喜欢引用而不是指针。引用不能为空,它们总是引用一个对象。


    请注意,有时当函数复制参数时,避免复制是没有意义的。考虑:

     void foo(const std::vector<int>& a) { 
          auto copy = a;
          // ...
     }
    

    然后用

     void foo(std::vector<int> a) {
          // a is already a copy
          // ...
     }
    

    更明显的是该函数正在复制,而通过引用传递没有保存任何内容。

    【讨论】:

    • 我认为这也取决于函数本身内部正在做什么。如果函数仍然复制参数,那么按值传递可能比在函数内部进行手动编码复制更优化。
    • @PaulMcKenzie ...除非从函数返回副本,在这种情况下,afaik 最好在函数中制作副本以获取 nrvo。是的,你是对的,我尽量保持简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2022-01-12
    • 1970-01-01
    • 2013-07-21
    • 2015-05-29
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多