状態のないファンクタークラスがあるが、新しいものを使用してヒープから作成する場合、一般的なコンパイラーは、作成のオーバーヘッドを完全に最適化するのに十分スマートですか?
この質問は、ステートレスなファンクターをたくさん作成するときに出てきました。それらがスタックに割り当てられている場合、それらの0状態のクラス本体は、スタックが実際にはまったく変更されていないことを意味しますか?後でファンクターインスタンスのアドレスを取得する場合に備えて、それが必要なようです。ヒープ割り当てについても同じです。
その場合、ファンクターは常に(些細な、しかしゼロではない)オーバーヘッドを作成に追加します。しかし、コンパイラはそのアドレスが使用されているかどうかを確認でき、使用されていない場合はそのスタック割り当てを排除できる可能性があります。(または、ヒープ割り当てを削除することもできますか?)
しかし、一時的に作成されたファンクターはどうですか?
#include <iostream>
struct GTfunctor
{
inline bool operator()(int a, int b) {return a>b; }
};
int main()
{
GTfunctor* f= new GTfunctor;
GTfunctor g;
std::cout<< (*f)(2,1) << std::endl;
std::cout<< g(2,1) << std::endl;
std::cout<< GTfunctor()(2,1) << std::endl;
delete f;
}
したがって、上記の具体的な例では、3つの行はそれぞれ3つの異なる方法で同じファンクターを呼び出します。この例では、方法の間に効率の違いはありますか?または、コンパイラーは、計算のない印刷ステートメントになるまで、各行を最適化できますか?
編集:ほとんどの回答は、コンパイラがヒープに割り当てられたファンクターをインライン化/削除することはできないと言っています。しかし、これも本当に本当ですか?ほとんどのコンパイラ(GCC、MS、Intel)には、リンクタイムの最適化もあり、実際にこの最適化を行うことができます。(しかし、そうですか?)