Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Лучший способ вернуть контейнер

#cpp #cpp14


std::vector fun()
{
    std::vector temp;
    for(...)
    {
        // заполняем "temp" чем-либо
    }
    return temp;
}

std::vector testVec = fun();


или

void fun(std::vector& vec)
{
    for(...)
    {
        // заполняем "vec" чем либо
    }
}

std::vector testVec; fun(testVec);


Как будет лучше, быстрее и вообще - как правильно вернуть контейнер? 

p.s.
Прочитал кучу статей на эту тему на зарубежном "стэке", но там все темы старые, а
уже вышел с++14 и 2016 год на дворе, хотелось бы услышать советы и мнения "экспертов"
по с++, с учетом новых стандартов, в общем поделитесь пожалуйста опытом.
    


Ответы

Ответ 1



Здесь отличия скорее не технические - как быстрее (как вам уже ответили, практически одинаково), а семантические. Например, если в функции вы вносите какие-то элементы в вектор, то в первом варианте вы можете вносить их только в изначально пустой вектор, а во втором варианте - дополнять уже непустой вектор. Словом, поступайте так, как правильнее с точки зрения логики программы :)

Ответ 2



В контексте этого вопроса, в С++14 ничего существенно не поменялось по сравнению с С++11. Используйте первый вариант, тогда либо оптимизатор сделает NRVO (частный случай copy elision), либо произойдет вызов перемещающего конструктора, т.к. в return temp; выражение temp считается r-value. Подробнее можно почитать в этом вопросе.

Комментариев нет:

Отправить комментарий