如果我有许多类使用具有纯虚拟接口的其他类,编译器是否可以对其进行优化,使其在启用完全优化的情况下在
Release Mode
中不进行虚拟调用?
例如,我有一个类
HardwareBuffer
,其中包含指向 IHardwareResourceManager
的指针,该指针具有虚拟方法:
virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;
并且在
HardwareBuffer
的 Release 方法中,我调用
m_pHardwareResourceManager->Release(this);
有一个继承
Render
的类IHardwareResourceManager
,我实际上在其中实现了虚拟Release
方法。当我创建 HardwareBuffer
时,我将其 m_pHardwareResourceManager
设置为 Renderer
本身。
IHardwareResourceManager::Release
的Release方法中对HardwareBuffer
的调用可以去虚拟化吗?
我不知道 MSVC 何时可以完成它,但我确实知道,一般来说,人们必须一路追踪 m_pHadwareResourceManager 直到
Render
的构造。 必须小心:DLL 总是可以创建 IHardwareRResourceManager
的新实例并将其提供给您的应用程序。 这是一项相当艰巨的任务,除非您在堆栈上分配了 Render
对象。
话虽这么说,像这样从 VTABLE 进行的间接查找在硬件级别上进行了积极优化,因为它们经常发生。 在假设虚拟函数调用成本较高之前,请确保进行分析。 例如,如果在 x64 上,间接查找比您正在调用的函数的序言和尾声便宜,我不会感到惊讶。
作为比较:DirectX 使用 COM,它对每个函数调用都有类似的间接查找。