0

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

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

virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;

在 Release 方法中HardwareBuffer,我调用

m_pHardwareResourceManager->Release(this);

有一个Render继承的类,IHardwareResourceManager我实际上在其中实现了虚拟Release方法。当我创建 aHardwareBuffer时,我将其设置m_pHardwareResourceManagerRenderer自身。

可以去虚拟IHardwareResourceManager::Release化Release方法中的HardwareBuffer调用吗?

4

1 回答 1

0

我不知道 MSVC 什么时候可以完成它,但我确实知道,一般来说,人们必须一直追踪 m_pHadwareResourceManager 直到Render. 必须小心:DLL 总是可以创建一个新实例IHardwareRResourceManager并将其提供给您的应用程序。这是一项相当艰巨的任务,除非您Render在堆栈上分配对象。

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

比较:DirectX 使用 COM,它对每个函数调用都有类似的间接查找。

于 2013-09-11T23:47:37.250 回答