6

我一直在代码中折腾 ComPtrs,因为我到处都需要它们,但我一直在这样做:

HRESULT Material::Initialize(aiMaterial* pMaterial,
                             Microsoft::WRL::ComPtr<ID3D11Device1> & d3dDevice,
                             Microsoft::WRL::ComPtr<ID3D11DeviceContext1> & d3dContext)

这是否完全否定了 ComPtr 的引用计数优势?我应该只做一个按值传递(没有&)吗?

谢谢你的阅读

4

3 回答 3

3

完全可以,最好将它作为 const& 传递。

从语义的角度来看,按值传递是可以接受的,而不是从性能的角度来看,因为传递会导致引用计数上下颠簸,并且两者都是具有严重后果的“互锁”操作。而我们一无所获。

ComPtr 的好处是它允许正确匹配 Release 调用,这太容易搞砸了,即使很容易,它所采用的代码混乱也是令人不快的。

于 2013-06-17T19:46:45.703 回答
2

不,你做对了。被调用者不必修改引用计数,除非它需要在调用后保留接口以进行访问。增加和减少引用计数不是免费的——它是一个虚拟调用加上一个互锁的递增或递减——所以无论如何你都会得到更好的性能。不过,您应该使用 const 引用 - 甚至只是传递一个原始指针。

于 2013-06-17T19:49:45.750 回答
1

是的,在我的 DirectX 代码中,我安排我的引擎以明确哪个对象有权管理 DirectX COM 对象的生命周期。然后我将它作为原始指针传递给需要它们的方法(我避免让成员变量尽可能地跟踪 DX 对象)。

于 2013-06-18T21:36:51.630 回答