MSVC可以自动优化这种情况吗?
Can MSVC automatically optimize this case?
如果我有许多类使用具有纯虚拟接口的其他类,编译器是否可以对其进行优化,以便在启用完全优化的情况下不进行虚拟调用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,它在每个函数调用上都有类似的间接查找。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 在这种情况下,编译器会进行优化吗?
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- Intel OpenCL编译器:优化结构使用情况
- 在没有返回值优化的情况下将两个对象加在一起时,将创建多少个临时对象
- 默认情况下在CMAKE中进行优化
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- 在这种情况下,为什么QMAKE添加-O1和-O2优化标志
- C 控制台应用程序;在牙科诊所情况下,时间优化了队列
- 如何消除只在启用优化的情况下出现的错误
- 程序在没有调试符号的情况下崩溃,运行良好(两种情况下都没有优化或任何内容)
- 是否存在算术运算受到编译器优化影响的情况
- LLVM优化器无法处理简单情况?
- Visual Studio 2013 在存在 /OPT:ICF 的情况下是否进行了正确优化?
- 如何在没有调试符号和优化的情况下创建 cmake 构建配置
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)
- 有没有办法告诉 clang 在没有其他优化的情况下生成 TBAA 元数据
- 编译器是否在返回成员变量的情况下执行返回值优化
- MSVC可以自动优化这种情况吗?