C/C++ 11中的大数据哪种“返回”方法更好?
这个问题是由C11中的RVO的混淆引发的.
我有两种方法来“返回”值:返回值并返回参考参数.如果我不考虑表演,我更喜欢第一个.因为值的返回是更自然的,我可以很容易地区分输入和输出.但是,如果我考虑到返回大数据时的效率.我不能决定,因为在C 11,有RVO. 这是我的示例代码,这两个代码做同样的工作: 按价值返回 struct SolutionType { vector<double> X; vector<double> Y; SolutionType(int N) : X(N),Y(N) { } }; SolutionType firstReturnMethod(const double input1,const double input2); { // Some work is here SolutionType tmp_solution(N); // since the name is too long,I make alias. vector<double> &x = tmp_solution.X; vector<double> &y = tmp_solution.Y; for (...) { // some operation about x and y // after that these two vectors become very large } return tmp_solution; } 通过参考参数返回 void secondReturnMethod(SolutionType& solution,const double input1,const double input2); { // Some work is here // since the name is too long,I make alias. vector<double> &x = solution.X; vector<double> &y = solution.Y; for (...) { // some operation about x and y // after that these two vectors become very large } } 这是我的问题: >如何确保在C 11发生RVO? UPDATE 这是一些有用的相关链接,帮助我了解这个问题: > How to return large data efficiently in C++11 解决方法
首先,您正在做的正确的技术术语是NRVO. RVO涉及退回的临时人员:
X foo() { return make_x(); } NRVO是指返回的命名对象: X foo() { X x = make_x(); x.do_stuff(); return x; } 第二,(N)RVO是编译器优化,而不是强制的.但是,您可以非常确定如果您使用现代编译器,(N)RVO将被非常积极地使用. 第三,(N)RVO不是C11功能 – 这是很久以前的2011年. 总而言之,你在C11中有一个移动构造函数.因此,如果您的类支持移动语义,即使(N)RVO没有发生,它将被移动,而不是复制.不幸的是,并不是所有的东西都能被语义上有效地移动. 第五,参考回归是一个可怕的反模式.它确保对象将被有效地创建两次 – 首次作为“空”对象,第二次填充数据时,并且排除了使用“空”状态不是有效不变量的对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |