Использование std :: move () и assign в списке инициализатора члена конструктора - PullRequest
0 голосов
/ 01 марта 2020

В чем преимущество использования std :: move () в параметризованном конструкторе (со списком инициализаторов) вместо обычной инициализации члена, т.е. присваивания?

например,

#include <iostream>
#include <vector>

template <typename V>
class myVec{
    private:
        std::vector< std::vector<V> > vec;

    public:
        myVec1(const std::vector< std::vector<V> > &myArr):vec(myArr) {};
        myVec2(const std::vector< std::vector<V> > &myArr):vec(std::move(myArr)) {};
        };

Какое преимущество (память, производительность и т. Д. c.) Получает одно преимущество от использования myVec1 вместо другого?

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

В этом случае разница в производительности отсутствует.

std::move(myArr) создаст постоянную ссылку на myArr. Теперь, поскольку myArr не является модифицируемой привязкой, это недопустимо для ссылки на rvalue, но может связываться с ссылкой на const lvalue. Таким образом, vec(std::move(myArr)) в конечном итоге вызовет конструктор копирования vector.

То, что вы хотите здесь:

myVec(const std::vector< std::vector<V> > &myArr):vec(myArr) {}; // 1
myVec(std::vector< std::vector<V> > &&myArr):vec(std::move(myArr)) {}; // 2

Теперь вернемся к исходному вопросу, скажем, у вас есть конструкторы, как указано выше. Если вы используете move-ctor (2), вы явно экономите на большом количестве копий. Обратите внимание, что здесь вы moving являетесь владельцем данных из исходного вектора, так что имейте в виду ваш вариант использования.

Сколько преимуществ

Я просто скажу много.

0 голосов
/ 01 марта 2020

В вашем случае будет нулевое изменение производительности, так как ввод в обоих случаях равен const

Как правило, при правильном использовании конструкторов перемещения выигрыш будет большим, поскольку не будет ненужного копирования и распределения - по одному на каждый экземпляр std::vector.

...