次のコードを検討してください。
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)が発生することを期待できるかどうかを考えていたときに、JerryCoffin [強調鉱山]によるこの回答を見つけました。
少なくともIMOは、通常は悪い考えですが、効率上の理由からではありません。問題の関数は通常、イテレータを介して出力を生成する汎用アルゴリズムとして記述される必要があるため、これはお勧めできません。イテレータを操作する代わりにコンテナを受け入れるか返すほとんどすべてのコードは、疑わしいと見なされます。
誤解しないでください。コレクションのようなオブジェクト(文字列など)を渡すのが理にかなっている場合もありますが、引用した例では、ベクトルを渡すか返すのはお勧めできません。
Pythonのバックグラウンドを持っているので、ジェネレーターがとても好きです。実際、Pythonの場合、上記の関数をジェネレーターとして記述します。つまり、他の何かが発生する前にデータ全体を処理する必要がないようにします。たとえば、次のようになります。
def process_data(input_data):
for item in input_data:
# somehow process items
yield result_data
私がジェリー・コフィンズのメモを正しく解釈した場合、これは彼が提案したことですよね?もしそうなら、どうすればこれをC ++で実装できますか?