考虑以下代码。
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) 发生时,我找到了 Jerry Coffin [强调我的]的答案:
至少在国际海事组织,这通常是一个糟糕的主意,但不是出于效率原因。这是一个糟糕的主意,因为所讨论的函数通常应该编写为通过迭代器产生其输出的通用算法。几乎所有接受或返回容器而不是在迭代器上操作的代码都应该被认为是可疑的。
不要误解我的意思:有时传递类似集合的对象(例如,字符串)是有意义的,但对于引用的示例,我认为传递或返回向量是一个糟糕的主意。
有一些 Python 背景,我非常喜欢 Generators。实际上,如果它是 Python,我会将上面的函数编写为生成器,即避免在发生其他任何事情之前处理整个数据的必要性。例如像这样:
def process_data(input_data):
for item in input_data:
# somehow process items
yield result_data
如果我正确解释了 Jerry Coffins 的注释,这就是他的建议,不是吗?如果是这样,我如何在 C++ 中实现它?