首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++11中,按值传递是一个合理的默认值吗?

在C++11中,按值传递是一个合理的默认值吗?
EN

Stack Overflow用户
提问于 2011-09-29 12:59:33
回答 2查看 26.5K关注 0票数 144

在传统的C++中,通过值传递到函数和方法对于大型对象来说速度很慢,而且通常不受欢迎。取而代之的是,C++程序员倾向于传递引用,这更快,但这引入了关于所有权的各种复杂问题,特别是关于内存管理(在对象是堆分配的情况下)

现在,在C++11中,我们有了Rvalue引用和移动构造函数,这意味着可以实现一个大型对象(如std::vector),通过值传入和传出函数的成本很低。

那么,这是否意味着默认情况下应该通过值传递std::vectorstd::string等类型的实例呢?那么对于自定义对象呢?新的最佳实践是什么?

EN

回答 2

Stack Overflow用户

发布于 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

所有其他签名都应该谨慎使用,并且要有充分的理由。编译器现在几乎总是以最有效的方式解决这些问题。你可以继续写你的代码了!

票数 72
EN

Stack Overflow用户

发布于 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 AbrahamsXiang Fan的这些博客文章。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7592630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档