gpt4 book ai didi

c++ - 哪种 "return"方法更适用于C++/C++11中的大数据?

转载 作者:可可西里 更新时间:2023-11-01 16:28:05 26 4
gpt4 key购买 nike

这个问题是由于对 C++11 中的 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
}
}

这是我的问题:

  1. 我如何确保在 C++11 中发生 RVO?
  2. 如果我们确定发生了 RVO,在当今的 C++ 编程中,您推荐哪种“返回”方法?为什么?
  3. 为什么有些库使用引用参数返回,代码风格或历史原因?

更新多亏了这些答案,我知道第一种方法在大多数方面都更好。

这里有一些有用的相关链接,可以帮助我理解这个问题:

  1. How to return large data efficiently in C++11
  2. In C++, is it still bad practice to return a vector from a function?
  3. 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 不是 C++11 特性 - 它早在 2011 年之前就存在了。

第四,您在 C++11 中拥有的是一个移动构造函数。因此,如果您的类支持移动语义,它将被移动,而不是被复制,即使 (N)RVO 没有发生。不幸的是,并非所有内容都可以有效地进行语义移动。

第五,通过引用返回是一个可怕的反模式。它确保对象将被有效创建两次 - 第一次作为“空”对象,第二次填充数据时 - 并且它阻止您使用“空”状态不是有效不变量的对象。

关于c++ - 哪种 "return"方法更适用于C++/C++11中的大数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com