と の 2 つの仮想メンバー関数を持つクラスがfoo
ありwrapper
ます。foo
短くて高速で、何度wrapper
も呼び出すループが含まれています。オブジェクトへのポインターから呼び出された場合でも、ラッパー関数内foo
への呼び出しをインライン化する方法があることを願っています。foo
MyClass *obj = getObject();
obj->foo(); // As I understand it, this cannot be inlined. That's okay.
obj->wrapper(); // Nor will this. However, I hope that the machine code
// for the wrapper function will contain inlined calls to
// foo().
基本的に、コンパイラーが複数のバージョンのラッパー関数 (可能なクラスごとに 1 つ) を生成し、適切な へのインライン呼び出しを生成するようにします。これは、実行する関数をfoo
選択する前にオブジェクトの種類が決定されるため可能になるはずです。wrapper
これは可能ですか?この最適化をサポートするコンパイラはありますか?
編集:これまでのすべてのフィードバックと回答に感謝しており、そのうちの 1 つを選ぶことになるかもしれません。ただし、ほとんどの回答は、この最適化が実現可能であると考える理由を説明する私の質問の最後の部分を無視しています。それが本当に私の質問の核心であり、誰かがそれに対処できることを望んでいます。
編集2:Vladの答えを選んだのは、彼が人気のある回避策を提案し、提案された最適化に部分的に対処したためです(Davidの答えのコメントで)。回答を書いてくれたすべての人に感謝します-私はそれらすべてを読みましたが、明確な「勝者」はありませんでした.
また、私が提案しているものと非常によく似た最適化を提案している学術論文を見つけました: http://www.ebb.org/bkuhn/articles/cpp-opt.pdf。