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

kam*_*r83 2 c++ vector parameter-passing

在我的程序中,我有一个将多个向量作为参数的函数。我曾经将它们作为法向量传递,因此函数的定义如下所示:

void do(std::vector<int> a, std::vector<int> b, std::vector<int> c){
Run Code Online (Sandbox Code Playgroud)

电话看起来像这样:

do(d, e, f);
Run Code Online (Sandbox Code Playgroud)

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

void do(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c){
Run Code Online (Sandbox Code Playgroud)

和这样的电话:

do(&d, &e, &f);
Run Code Online (Sandbox Code Playgroud)

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

for*_*818 7

考虑 C++ 核心准则F.16:对于“in”参数,通过值传递廉价复制的类型,并通过引用 const 传递其他类型

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

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


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

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

然后用

 void foo(std::vector<int> a) {
      // a is already a copy
      // ...
 }
Run Code Online (Sandbox Code Playgroud)

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