Рассмотрим следующий код.
std::vector<result_data> do_processing()
{
pqxx::result input_data = get_data_from_database();
return process_data(input_data);
}
std::vector<result_data> process_data(pqxx::result const & input_data)
{
std::vector<result_data> ret;
pqxx::result::const_iterator row;
for (row = input_data.begin(); row != inpupt_data.end(); ++row)
{
// somehow populate output vector
}
return ret;
}
Пока я думал о том, может ли я ожидать, что Оптимизация возвращаемого значения (RVO) произойдет, я нашел этот ответ Джерри Коффина [акцент мой]:
По крайней мере, ИМО, это обычно плохая идея, но не по соображениям эффективности. Это плохая идея, потому что рассматриваемая функция обычно должна быть написана как общий алгоритм , который выдает свой результат через итератор. Почти любой код, который принимает или возвращает контейнер вместо работы на итераторах, должен считаться подозрительным.
Не поймите меня неправильно: бывают времена, когда имеет смысл передавать объекты, подобные друг другу (например, строки), но в приведенном примере я бы рассмотрел передачу или возвращение вектора в плохую идею.
Имея некоторый фон Python, мне очень нравятся генераторы. На самом деле, если бы это был Python, я бы написал выше функцию в качестве генератора, т.е. Чтобы избежать необходимости обработки всех данных до того, как что-либо еще может произойти. Например, например:
def process_data(input_data):
for item in input_data:
# somehow process items
yield result_data
Если я правильно интерпретирую слова Джерри Коффина, это то, что он предложил, не так ли? Если да, как это реализовать на С++?