我整天都在阅读关于传递参数的最有效方法,我很困惑。我想传递这样的矢量:
Foo f({1,2,3});
我只是想用传递的向量初始化我的 _member 变量。现在的问题是我的构造函数应该如何显示:
// pass by value
Foo (vector<int> vec) : _member{vec} {}
// const reference
Foo (const vector<int>& vec) : _member{vec} {}
// rvalue reference
Foo (vector<int>&& vec) : _member{std::move(vec)} {}
答案 0 :(得分:11)
最简单的方法是按值取矢量,然后移动它:
Foo (vector<int> vec) : _member{std::move(vec)} {}
与一对const vector<int>&
/ vector<int>&&
重载相比,你需要支付一个额外的移动(对于向量来说非常便宜),但不必编写两个构造函数(可能会爆炸)如果您有多个参数,请很快。)
答案 1 :(得分:2)
现在很多圈子里的价值传递很流行。我认为出于各种原因,它对于施工人员来说是个不错的选择,所以我同意T.C。的回答。但是,更广泛的问题是传递参数(到非构造函数)的最佳方法,我很少建议按值传递。我非常非常强烈建议您听一下Herb Sutter关于这个话题的部分内容:https://youtu.be/xnqTKD8uD64?t=51m34s。
总结一下,在构造函数之外:与const-ref简单传递相比,pass by value给出了更糟糕的最坏情况性能保证,它在所有情况下都比const-ref / rvalue-ref重载性能更差,这使得它变得更难为了提供异常保证,它会切割多态类型,在复制是有条件的时候不能使用它。
在大多数情况下,你要么在合理范围内不关心表现,要么你在乎。在第一种情况下,使用const-ref更简单,更容易。在第二种情况下,传递值不够好。再次,请记住构造函数由于几个不同的原因而不同(它们是移动构造事物而不是移动分配,它们会采用许多参数来强烈影响所需的重载次数。)
不幸的是,这个问题没有这么简单的答案。最终这两种方法都足够好,但我认为掌握C ++你想知道两者的优缺点。
答案 2 :(得分:0)
在这种特殊情况下,您传递的是rvalue
,因此第三种选择是最好的。