C++でラムダ関数を使用すると、値によって取り込まれる変数はcopy of the valueを意味します。C++ラムダは実際にコピーによってキャプチャされたパラメータのコピーを作成しますか?
ラムダ関数内の値を変更しないと良いコンパイラを使用していれば、コードをコンパイルして最適化しても実際のコピーがないことを期待できますか?
たとえば、読み取り専用モードで使用されているので、new_item
を値として渡すのが理にかなっているようです。
void loadavg_file::add(loadavg_item const & new_item)
{
auto const & it(std::find_if(
f_items.begin(),
f_items.end(),
[new_item](auto const & item)
{
return (item.f_address == new_item.f_address);
}));
if(it == f_items.end())
{
f_items.push_back(it);
}
else
{
// replace existing item with new avg and timestamp
it->f_timestamp = new_item.f_timestamp;
it->f_avg = new_item.f_avg;
}
}
は、ループが実行に最適化され、new_item
の全くのコピーにつながることでしょうか?
保証はありません。良いコンパイラ*はコピーを最適化するかもしれませんが、必須ではありません。 –
あなたが知っている唯一の事柄は、コードがそのように振舞う必要があることです。すべてをインライン展開するときとコピー/オブジェクトを作成しないとき、そしてあなたが書いたことの間に違いがなければ、コンパイラはそれを行うことができます。それは?コンパイルしてアセンブリをチェックしてください。 – NathanOliver
この質問は他の2人のコメント作成者よりも私にとって面白いようです。 AFAIK、コンパイラは特定の条件でのみコピーを削除することが許可されています。ラムダキャプチャがその1つであるかどうかはわかりません。 (コピーが些細な場合は問題ありませんが、OPはおそらくコピーが些細なものかどうかは気にしません)。 – zneak