我具有以下功能
std::pair<Eigen::ArrayXXd, Eigen::VectorXd> f(...){
...
auto a = Eigen::ArrayXXd(N,M);
auto b = Eigen::VectorXd(M);
...
return {std::move(a), std::move(b)};
}
int main() {
...
const auto &[a_up, b_up] = f(...);
writeToFile("b_up.txt", b_up);
...
}
在函数f
中,我们分配并初始化特征数组和向量a
和b
。使用move
关键字,我们仍然使用在函数f
内部分配的相同内存。由于const auto & b_up = f(...)
也在函数f
之外,因此使用了相同的存储空间,因此我们无需复制任何内容。这个对吗?但是,通过引用传递的好处是什么。是否发生复制?
return
函数中的f
语句创建std::pair
由于RVO,即使您编写,也不会进一步复制它:
auto ab_pair = f(...);
但是仍然必须移动或复制a
和b
,但是有一种方法可以使用std::piecewise_construct
在适当的位置构造该对,然后通过引用RVO将其返回:
auto f(...){
std::pair<Eigen::ArrayXXd, Eigen::VectorXd> result{
std::piecewise_construct,
std::make_tuple(N,M),
std::make_tuple(M),
};
...
return result;
}