我是否完全否定了Microsoft::WRL::ComPtr作为引用传递的好处(&) ?
Am I completely negating the benefit of Microsoft::WRL::ComPtr by passing it around as a reference (&)?
我一直在代码中折腾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对象)。
相关文章:
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 形成对对象的引用是否构成访问?
- C++ 引用是否在需要时隐式转换为值?
- 右值引用是否具有与右值引用相同的开销?
- 返回引用是否也会延长其生存期?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- 强制转换为指针引用是否会导致未定义的行为
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 结构化绑定和转发引用是否混合良好?
- 此常量引用是否保留了其生命?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 在 C++ 中更改越界指针的取消引用是否安全?
- 本地引用是否由"DetachCurrentThread"清除?
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 常量右值引用是否允许对编译器进行额外优化?
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 返回强制引用是否安全