【发布时间】:2016-09-04 05:01:04
【问题描述】:
我对在 C++11 中返回大数据感到非常困惑。最有效的方法是什么? 这是我的相关功能:
void numericMethod1(vector<double>& solution,
const double input);
void numericMethod2(pair<vector<double>,vector<double>>& solution1,
vector<double>& solution2,
const double input1,
const double input2);
这是我使用它们的方式:
int main()
{
// apply numericMethod1
double input = 0;
vector<double> solution;
numericMethod1(solution, input);
// apply numericMethod2
double input1 = 1;
double input2 = 2;
pair<vector<double>,vector<double>> solution1;
vector<double> solution2;
numericMethod2(solution1, solution2, input1, input2);
return 0;
}
问题是,std::move() 在后续实现中没有用吗?
实施:
void numericMethod1(vector<double>& solution,
const double input)
{
vector<double> tmp_solution;
for (...)
{
// some operation about tmp_solution
// after that this vector become very large
}
solution = std::move(tmp_solution);
}
void numericMethod2(pair<vector<double>,vector<double>>& solution1,
vector<double>& solution2,
const double input1,
const double input2)
{
vector<double> tmp_solution1_1;
vector<double> tmp_solution1_2;
vector<double> tmp_solution2;
for (...)
{
// some operation about tmp_solution1_1, tmp_solution1_2 and tmp_solution2
// after that the three vector become very large
}
solution1.first = std::move(tmp_solution1_1);
solution1.second = std::move(tmp_solution1_2);
solution2 = std::move(tmp_solution2);
}
如果它们没有用,我如何处理这些大返回值而不复制多次? 免费更改 API!
更新
感谢 StackOverFlow 和这些答案,在深入研究相关问题后,我更了解这个问题。由于 RVO,我更改了 API,为了更清楚,我不再使用 std::pair。这是我的新代码:
struct SolutionType
{
vector<double> X;
vector<double> Y;
};
SolutionType newNumericMethod(const double input1,
const double input2);
int main()
{
// apply newNumericMethod
double input1 = 1;
double input2 = 2;
SolutionType solution = newNumericMethod(input1, input2);
return 0;
}
SolutionType newNumericMethod(const double input1,
const double input2);
{
SolutionType tmp_solution; // this will call the default constructor, right?
// 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;
}
我怎么知道 RVO 发生了?或我如何确保 RVO 发生?
【问题讨论】:
-
主题似乎不足以质疑内容......
-
这些在这种情况下也不是没用,但是为什么不直接使用
solution1和solution2呢?还是参考他们? -
@jacek-cz 刚刚编辑,这是一个错误,对不起!
-
@Reigs 如果我理解真正/中心问题... :(
标签: c++ c++11 parameter-passing return-value