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 个元素,这是否有很大区别?
考虑 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)
更明显的是,该函数正在制作副本,而通过引用传递没有保存任何内容。