28

C++0x (VS2010 の下) でラムダ式を使用することに関連するオーバーヘッドはありますか? 関数オブジェクトを使用するとオーバーヘッドが発生する
ことはわかっていますが、たとえば、STL アルゴリズムに渡される式について言及しています。コンパイラは式を最適化し、関数呼び出しのように見えるものを排除しますか? ラムダ式が本当に好きになりましたが、速度の低下が少し心配です。

前もって感謝します!

4

2 に答える 2

48

関数オブジェクトがオーバーヘッドを発生させることを「知っています」? おそらく、事実を再確認する必要があります。:)

通常、関数オブジェクトで STL アルゴリズムを使用する場合、手作業でループを作成する場合と比較して、オーバーヘッドはゼロです。素朴なコンパイラはファンクターを繰り返し呼び出す必要がありますoperator()が、インライン化するのは簡単なので、実質的にオーバーヘッドはゼロです。

ラムダ式は、関数オブジェクトのシンタックス シュガーにすぎません。コードはコンパイラによって関数オブジェクトに変換されるため、オーバーヘッドもありません。

于 2010-07-10T10:48:01.517 に答える
19

フードの下、

void f(char delim)
{
  std::for_each( seq.begin()
               , seq.end()
               , [=](const T& obj){std::cout << obj << delim;} );
}

おおよそ次のように変換されます

class __local_class_name {
  char __delim;
public:
  __local_class_name(char delim) : __delim(delim) {}
  void operator()(const T& obj) {std::cout << obj << __delim;}
};

void f(char delim)
{
  std::for_each( seq.begin()
               , seq.end()
               , __local_class_name(delim) );
}

すべての関数オブジェクトと同様に、呼び出しは簡単にインライン化できるため、オーバーヘッドはごくわずかです。

于 2010-07-10T10:44:34.193 に答える