【问题标题】:Can MSVC automatically optimize this case?MSVC 可以自动优化这种情况吗?
【发布时间】:2013-09-11 16:07:07
【问题描述】:

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

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

virtual void ReleaseBuffer(HardwareBuffer* buffer) = 0;

HardwareBuffer的Release方法中,我调用了

m_pHardwareResourceManager->Release(this);

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

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

【问题讨论】:

  • 你的格式伤害了我的眼睛。你能让这个更具可读性吗?
  • 这可能作为代码更具可读性。如果我理解正确,我会说在大多数情况下虚拟功能不会被优化掉。查看stackoverflow.com/questions/2141726/… 了解更多信息。
  • 在少数情况下,变量的类型,即使它以多态方式使用,在编译时也是未知的,所以当您担心虚函数性能时(VTABLE 及其固有指令缓存冲突),通过 CRTP 实现静态多态性可能是一个不错的选择
  • 所以,编写如下代码:pastebin.com/MwiSceUD?

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多