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

问题描述 投票:0回答:1

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

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
的调用可以去虚拟化吗?

c++ optimization visual-studio-2012
1个回答
0
投票

我不知道 MSVC 何时可以完成它,但我确实知道,一般来说,人们必须一路追踪 m_pHadwareResourceManager 直到

Render
的构造。 必须小心:DLL 总是可以创建
IHardwareRResourceManager
的新实例并将其提供给您的应用程序。 这是一项相当艰巨的任务,除非您在堆栈上分配了
Render
对象。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.