我是否完全否定了Microsoft::WRL::ComPtr作为引用传递的好处(&) ?

Am I completely negating the benefit of Microsoft::WRL::ComPtr by passing it around as a reference (&)?

本文关键字:引用 是否 ComPtr WRL Microsoft      更新时间:2023-10-16

我一直在代码中折腾ComPtrs因为我需要它们在这里和那里,但我一直这样做:

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

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

感谢您的阅读

这是完全可以的,最好将其作为const&传递。

从语义的角度来看,

按值传递是可以接受的,但从性能的角度来看就不太好了,因为传递

会导致重新计数上下颠簸,而且这两种操作都是"连锁"的,会带来严重的后果。我们什么也得不到。

ComPtr的好处是它允许Release调用的适当匹配,这很容易弄乱,即使很容易,它所使用的代码的混乱也是令人不愉快的。

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

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