MSVC可以自动优化这种情况吗?

时间:2013-09-11 16:07:08

标签: c++ optimization visual-studio-2012 compiler-construction

如果我有许多类使用纯虚拟接口的其他类,那么编译器可以优化此类,以便在Release Mode中没有启用完全优化的虚拟调用吗?

例如,我有一个类HardwareBuffer,其中包含一个指向IHardwareResourceManager的指针,该指针具有虚拟方法:

virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;

HardwareBuffer的发布方法中,我致电

m_pHardwareResourceManager->Release(this);

有一个类Render继承IHardwareResourceManager,我实际上实现了虚拟Release方法。当我创建HardwareBuffer时,我将其m_pHardwareResourceManager设置为Renderer本身。

IHardwareResourceManager::Release的发布方法中对HardwareBuffer的调用是否可以被虚拟化?

1 个答案:

答案 0 :(得分:0)

我不知道MSVC何时可以完成它,但我知道,一般来说,必须追踪m_pHadwareResourceManager一直回到Render的构造。必须要小心:DLL总是可以创建IHardwareRResourceManager的新实例并将其提供给您的应用程序。除非您在堆栈中分配了Render对象,否则这是一项非常艰巨的任务。

话虽如此,来自这样的VTABLE的间接查找在硬件级别上进行了优化,因为它们经常发生。在假设虚拟函数调用成本很高之前,请确保您进行了配置。例如,如果在x64上,间接查找比你正在调用的函数的序言和结尾便宜,我不会感到惊讶。

为了进行比较:DirectX使用COM,它在每个函数调用上都具有可比较的间接查找。