在c ++中使用move有什么好处

问题描述 投票:0回答:1

我具有以下功能

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中,我们分配并初始化特征数组和向量ab。使用move关键字,我们仍然使用在函数f内部分配的相同内存。由于const auto & b_up = f(...)也在函数f之外,因此使用了相同的存储空间,因此我们无需复制任何内容。这个对吗?但是,通过引用传递的好处是什么。是否发生复制?

c++17
1个回答
2
投票

return函数中的f语句创建std::pair由于RVO,即使您编写,也不会进一步复制它:

auto ab_pair  = f(...);

但是仍然必须移动或复制ab,但是有一种方法可以使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.