0

純粋な仮想インターフェイスを持つ他のクラスを使用する多くのクラスがある場合、コンパイラはこれを最適化しRelease Modeて、完全な最適化を有効にして仮想呼び出しを行わないようにすることはできますか?

たとえば、仮想メソッドを持つHardwareBufferポインターを含むクラスがあります。IHardwareResourceManager

virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;

の Release メソッドでHardwareBuffer、私は呼び出します

m_pHardwareResourceManager->Release(this);

Renderを継承する単一のクラスがありIHardwareResourceManager、そこで実際に仮想Releaseメソッドを実装します。を作成するときは、それ自体HardwareBufferを設定します。m_pHardwareResourceManagerRenderer

IHardwareResourceManager::Releaseの Release メソッドでの呼び出しをHardwareBuffer非仮想化できますか?

4

1 に答える 1

0

MSVC がいつそれを達成できるかはわかりませんが、一般的には m_pHadwareResourceManager をRender. 注意が必要です: DLL は常に の新しいインスタンスを作成し、IHardwareRResourceManagerそれをアプリケーションに提供する可能性があります。Renderスタックにオブジェクトを割り当てない限り、これは非常に困難な作業です。

そうは言っても、このような VTABLE からの間接的なルックアップは、頻繁に発生するため、ハードウェア レベルで積極的に最適化されます。仮想関数呼び出しが大きなコストであると想定する前に、必ずプロファイルを作成してください。たとえば、x64 では、呼び出している関数のプロローグとエピローグよりも間接的なルックアップの方が安価であるとしても、私は驚かないでしょう。

比較のために: DirectX は COM を使用します。COM は、すべての関数呼び出しで同等の間接ルックアップを行います。

于 2013-09-11T23:47:37.250 に答える