JavaScriptでは、クロージャが必要ない場合は、スクリプトのパフォーマンスに悪影響を与えるため、関数を他の関数内に作成しないことをお勧めします。JavaScriptでは、ループ内に関数を作成するときに、これと同じ懸念が当てはまります。同じ懸念がC ++ラムダにも当てはまりますか?
たとえば、これら2つの機能の間にパフォーマンスの違いはありますか。
int f1(vector<int> v) {
for_each(v.begin(), v.end(), [](int i) { cout << i << endl; });
}
auto print_int = [](int i) { cout << i << endl; };
int f2(vector<int> v) {
for_each(v.begin(), v.end(), print_int);
}
はい、これらの懸念はC ++に当てはまりf2
、f1
;よりもパフォーマンスが向上すると思います。しかし、私は明確な答えを見つけることができませんでした。
いいえ、はい。
単純なラムダの場合、それは問題ではありません。これは、ラムダがoperator()を持つクラスの単純な省略形であるためです。
関連する要素は、クラスにコンストラクターがあることです。想像してみてください:
std::map<std::string, std::string> m = create();
auto lambda = [m]() { /* code */ };
変更できないはずの多くの文字列をコピーするため、このキャプチャをループで実行しても意味がありません。この場合、参照によるキャプチャも意味があります。
私のアドバイスは次のとおりです。他のすべてのクラスと同じようにします。構築するのが難しい場合は、論理的な場所に配置してください。構築に費用がかかる場合は、なぜそれほど費用がかかるのかを考え、可能な場合は移動することを検討してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加