почему этот код считается плохой практикой
std::vector create() {
std::vector<HeavyType> temp = {... 10 objects }; // супер тяжелые объекты
return temp;
}
на практике д никогда не сталкивался с таким, вопрос был на собеседовании, и не могу
понять в чем тут рофл, добавлю что предположим HeavyType очень тяжеловесный тип данных
Ответы (2 шт):
В худшем случае все тяжёлые объекты копируются два раза: один при push_back, второй раз при возврате вектора из функции. Второе копирование может быть оптимизировано (NRVO), первое надо убирать меняя push_back на emplace_back.
Но, даже если NRVO не сработает, компилятор использует перемещающих конструктор, который есть у всех векторов. Этот конструктор не будет копировать сами тяжёлые объекты, только заголовок вектора - несколько байт.
На всякий случай дизайн без лишних копий:
void fill(std::vector<HeavyType> &a) {
a.clear();
a.reserve(1000000);
for (int i = 0; i < 1000000; i++){
a.emplace_back()
}
}
Потому что std::initializer_list (параметр конструктора вектора) сделан через одно место. Он хранит константные элементы, поэтому они будут копироваться, а не перемещаться.
А вот в return temp; все хорошо. Там либо одно перемещение вектора (не элементов), либо, что более вероятно, вообще ничего (если сработает NRVO).
Обратите внимание, это действует только на std::initializer_list, а не на любые списки в фигурных скобках.