Перемещение вектора, возвращенного из функции (C++)
Подскажите, будет ли перемещен вектор, возвращенный из функции, или произойдет копирование содержимого:
#include <vector>
using std::vector;
struct my_type
{
int data1;
int data2;
};
vector<my_type> test_func(int i, int j)
{
vector<my_type> result {{i, j}, {j, i}};
return result;
}
int main()
{
vector<my_type> vec_mt;
//...
vec_mt = test_func(1, 2); /* <---- MOVE or COPY ???
//...
}
Ответы (2 шт):
Копирования точно не будет.
В худшем случае будет перемещен два раза, в лучшем случае - один.
Если написать vector<my_type> vec_mt = test_func(1, 2);, то в худшем случае будет одно перемещение, а в лучшем - ноль.
Сам возврат локальной переменной из функции по значению либо использует NRVO, если компилятор достаточно умный (ноль перемещений), либо перемещение. Источник.
Вот такое присвоение vec_mt = test_func(1, 2); - одно перемещение.
Инициализация vector<my_type> vec_mt = test_func(1, 2); - в C++17 ноль перемещений, из-за обязательного RVO.
Зависит от используемого стандарда: дело в том, что 11 стандарда был введен copy elision - это означает что при подобном возврате из функции копирования не произойдет. Однако до 17 стандарта там существовали некоторые ограничения на copy elision, например возвращаемую переменную следовало объявлять первой, а иначе содержимое может быть скопировано. С 17-ого эти ограничения были сняты