C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C/C++ 11中的大数据哪种“返回”方法更好?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_450_1@这个问题是由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?
>如果我们确定RVO发生了,在现在的C编程中,你推荐哪种“返回”方法?为什么?
>为什么有一些图书馆通过参参数,代码风格或历史原因使用返回?

updatE
感谢这些答案,我知道第一种方法在多数情况下更好.

这是一些有用的相关链接,帮助我了解这个问题:

> How to return large data efficiently in C++11
> In C++,is it still bad practice to return a vector from a function?
> Want Speed? Pass by Value.

解决方法

首先,您正在做的正确的技术术语是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没有发生,它将被移动,而不是复制.不幸的是,并不是所有的东西都能被语义上有效地移动.

第五,参回归是一个可怕的反模式.它确保对象将被有效地创建两次 – 首次作为“空”对象,第二次填充数据时,并且排除了使用“空”状态不是有效不变量的对象.

大佬总结

以上是大佬教程为你收集整理的C/C++ 11中的大数据哪种“返回”方法更好?全部内容,希望文章能够帮你解决C/C++ 11中的大数据哪种“返回”方法更好?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。