почему этот код считается плохой практикой

std::vector create() {
    std::vector<HeavyType> temp = {... 10 objects }; // супер тяжелые объекты

    return temp;
}

на практике д никогда не сталкивался с таким, вопрос был на собеседовании, и не могу

понять в чем тут рофл, добавлю что предположим HeavyType очень тяжеловесный тип данных


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

В худшем случае все тяжёлые объекты копируются два раза: один при 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()
    } 
}
→ Ссылка
Автор решения: HolyBlackCat

Потому что std::initializer_list (параметр конструктора вектора) сделан через одно место. Он хранит константные элементы, поэтому они будут копироваться, а не перемещаться.

А вот в return temp; все хорошо. Там либо одно перемещение вектора (не элементов), либо, что более вероятно, вообще ничего (если сработает NRVO).


Обратите внимание, это действует только на std::initializer_list, а не на любые списки в фигурных скобках.

→ Ссылка