将指针传递给向量是否比向量本身更快?

Is it faster to pass the pointer to a vector than the vector itself?

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

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 个元素,这会有很大的不同吗?

考虑 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
      // ...
 }

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

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

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