29
std::function<int()> void f1()
{
    int a, b, c, d, ..., x, y, z;

    return [=] { return a + b + c; };
}

対。

std::function<int()> void f2()
{
    int a, b, c, d, ..., x, y, z;

    return [a, b, c] { return a + b + c; };
}

言うまでもなく、前者は後者よりも短く、扱いやすく、エレガントです。

しかし、私はまだ心配しています:

パフォーマンスの観点から、後者は常に前者よりも優れていますか?

標準は、ラムダ式が必要な変数のみをキャプチャすることを保証していますか? つまり、前の例では、a、b、c のみがキャプチャされ、未使用の変数 d、...、x、y、z はキャプチャされません。

4

3 に答える 3

44

標準では、デフォルト キャプチャを実行する場合、そのデフォルト キャプチャによって周囲の環境からキャプチャされる変数は、ラムダ内で実際に使用する変数のみであることが保証されています。

そのため、キャプチャする個々の変数を指定することは、使用する予定のドキュメントとして機能しますが、パフォーマンスに影響を与えることはありません。

気にする人にとっては、標準の正確な文言は次のとおりです (§5.1.2/11、12):

11 ラムダ式に関連付けられたキャプチャ デフォルトとその複合ステートメント odr-uses (3.2)thisまたは自動保存期間を持つ変数があり、odr-used エンティティが明示的にキャプチャされない場合、odr-used エンティティは暗黙的にキャプチャされます。そのようなエンティティは、ラムダ式の到達範囲内で宣言する必要があります。[注省略]

12 エンティティが明示的または暗黙的にキャプチャされた場合、エンティティはキャプチャされます。[...]

概要

暗黙的なキャプチャ仕様 ([=]または[&]) は、ラムダで使用される変数のみをキャプチャするため、暗黙的なキャプチャと明示的なキャプチャの違いがパフォーマンスに影響することはありません。

于 2013-09-26T02:25:49.863 に答える
0

意味的には、実際に必要な変数のみをラムダのスコープにインポートする必要があります。組み込み型以外の場合は、参照によるキャプチャも必要になる可能性があります。

于 2013-09-26T02:10:12.917 に答える