C++0x (VS2010 の下) でラムダ式を使用することに関連するオーバーヘッドはありますか? 関数オブジェクトを使用するとオーバーヘッドが発生する
ことはわかっていますが、たとえば、STL アルゴリズムに渡される式について言及しています。コンパイラは式を最適化し、関数呼び出しのように見えるものを排除しますか? ラムダ式が本当に好きになりましたが、速度の低下が少し心配です。
前もって感謝します!
C++0x (VS2010 の下) でラムダ式を使用することに関連するオーバーヘッドはありますか? 関数オブジェクトを使用するとオーバーヘッドが発生する
ことはわかっていますが、たとえば、STL アルゴリズムに渡される式について言及しています。コンパイラは式を最適化し、関数呼び出しのように見えるものを排除しますか? ラムダ式が本当に好きになりましたが、速度の低下が少し心配です。
前もって感謝します!
関数オブジェクトがオーバーヘッドを発生させることを「知っています」? おそらく、事実を再確認する必要があります。:)
通常、関数オブジェクトで STL アルゴリズムを使用する場合、手作業でループを作成する場合と比較して、オーバーヘッドはゼロです。素朴なコンパイラはファンクターを繰り返し呼び出す必要がありますoperator()
が、インライン化するのは簡単なので、実質的にオーバーヘッドはゼロです。
ラムダ式は、関数オブジェクトのシンタックス シュガーにすぎません。コードはコンパイラによって関数オブジェクトに変換されるため、オーバーヘッドもありません。
フードの下、
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) );
}
すべての関数オブジェクトと同様に、呼び出しは簡単にインライン化できるため、オーバーヘッドはごくわずかです。