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

Can MSVC automatically optimize this case?

本文关键字:情况 优化 MSVC      更新时间:2023-10-16

如果我有许多类使用具有纯虚拟接口的其他类,编译器是否可以对其进行优化,以便在启用完全优化的情况下不进行虚拟调用Release Mode

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

virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;

而在HardwareBuffer的释放方法中,我调用

m_pHardwareResourceManager->Release(this);

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

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

我不知道

MSVC何时可以完成它,但我知道,一般来说,人们必须m_pHadwareResourceManager一直追溯到Render的建设。 必须小心:DLL 始终可以创建IHardwareRResourceManager的新实例并将其提供给应用程序。 这是一项非常艰巨的任务,除非您在堆栈上分配了Render对象。

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

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

相关文章: