2011-07-27 5 views

答えて

3

まず、事実上と呼ばれるを機能をインライン化することはできません - コンパイラが呼び出すべき関数を知って最初のvtableポインタに取得する必要があります。 virtualとマークされたすべての機能が仮想的に呼び出されるわけではありません。

次に、__forceinlineは、派生クラスの実装に伝播しません。これは、関数ごとに影響を与える非標準のコンパイラ固有のキーワードです。したがって、インライン展開を強制するには、派生クラス関数でキーワードを再度適用する必要があります。再度、すべてのコールがインライン化されることを保証するものではありません。

+1

何もインライン化する必要がある場合は、同じ関数のアウトオブラインコピーを生成するためにコンパイラを停止しません。関数本体のために2つのコピーがあります - 一つはインラインで呼び出され、もう一つは事実上呼び出される必要があります。 – Viren

+0

仮想関数がインライン化できるので、プログラマがインライン化するのを止めるものはありません。コードが肥大化しますが、言語には制限がありません(ただし、やはり悪い習慣です)。 – Viren

+0

@Viren Shakya:Trueですが、関数そのものではなく、インライン呼び出しについて言います。 – sharptooth

2

これは、使用しているコンパイラで文書化する必要がありますが、私には、強制的であろうとなかろうと、「inlineness」は継承契約の一部ではないものです。そうではありません。

関連する問題