在传统的C++中,通过值传递到函数和方法对于大型对象来说速度很慢,而且通常不受欢迎。取而代之的是,C++程序员倾向于传递引用,这更快,但这引入了关于所有权的各种复杂问题,特别是关于内存管理(在对象是堆分配的情况下)
现在,在C++11中,我们有了Rvalue引用和移动构造函数,这意味着可以实现一个大型对象(如std::vector
),通过值传入和传出函数的成本很低。
那么,这是否意味着默认情况下应该通过值传递std::vector
和std::string
等类型的实例呢?那么对于自定义对象呢?新的最佳实践是什么?
发布于 2011-09-29 14:01:26
在几乎所有情况下,您的语义都应该是:
bar(foo f); // want to obtain a copy of f
bar(const foo& f); // want to read f
bar(foo& f); // want to modify f
所有其他签名都应该谨慎使用,并且要有充分的理由。编译器现在几乎总是以最有效的方式解决这些问题。你可以继续写你的代码了!
发布于 2012-12-20 04:12:02
如果在函数体中需要对象的副本或只需要移动对象,则按值传递参数。如果只需要对对象的非突变访问,则传递const&
。
对象复制示例:
void copy_antipattern(T const& t) { // (Don't do this.)
auto copy = t;
t.some_mutating_function();
}
void copy_pattern(T t) { // (Do this instead.)
t.some_mutating_function();
}
对象移动示例:
std::vector<T> v;
void move_antipattern(T const& t) {
v.push_back(t);
}
void move_pattern(T t) {
v.push_back(std::move(t));
}
非变异访问示例:
void read_pattern(T const& t) {
t.some_const_function();
}
有关基本原理,请参阅Dave Abrahams和Xiang Fan的这些博客文章。
https://stackoverflow.com/questions/7592630
复制相似问题