如果我有许多类使用纯虚拟接口的其他类,那么编译器可以优化此类,以便在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
的调用是否可以被虚拟化?
答案 0 :(得分:0)
我不知道MSVC何时可以完成它,但我知道,一般来说,必须追踪m_pHadwareResourceManager一直回到Render
的构造。必须要小心:DLL总是可以创建IHardwareRResourceManager
的新实例并将其提供给您的应用程序。除非您在堆栈中分配了Render
对象,否则这是一项非常艰巨的任务。
话虽如此,来自这样的VTABLE的间接查找在硬件级别上进行了优化,因为它们经常发生。在假设虚拟函数调用成本很高之前,请确保您进行了配置。例如,如果在x64上,间接查找比你正在调用的函数的序言和结尾便宜,我不会感到惊讶。
为了进行比较:DirectX使用COM,它在每个函数调用上都具有可比较的间接查找。