Каковы преимущества использования Move в C ++ - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующая функция

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 мы выделяем и инициализируем Eigen Array и Vector a и b. С ключевым словом move мы все еще используем ту же память, которая была выделена внутри функции f. С const auto & b_up = f(...) также вне функции f используется то же пространство памяти, поэтому нам никогда не приходилось ничего копировать. Это верно? Но в чем преимущество перед передачей по ссылке. Копирование происходит?

1 Ответ

2 голосов
/ 18 октября 2019

Оператор 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;
}
...