c – 将共享指针传递给非拥有函数时的最佳做法是什么?
发布时间:2020-12-16 10:35:47 所属栏目:百科 来源:网络整理
导读:由于使用共享指针,我经常在我想将它们传递给不必(必须)拥有该对象的函数的情况下运行.因为我知道在函数调用期间对象是有效的,我有四个传递指针的选项: 按价值计算 参考 弱指针 原始指针 起初我开始经常使用弱指针(因为我已经有了它们),但是一直锁定它们的开
由于使用共享指针,我经常在我想将它们传递给不必(必须)拥有该对象的函数的情况下运行.因为我知道在函数调用期间对象是有效的,我有四个传递指针的选项:
>按价值计算 起初我开始经常使用弱指针(因为我已经有了它们),但是一直锁定它们的开销很烦人并且达到了性能.现在我考虑通过引用传递原始指针或共享指针.有最好的做法吗? 解决方法
我建议通过const std :: shared_ptr< T>&传递它们.这有两个好处:
>引用计数不会产生任何开销(默认情况下不会增加引用计数) 在他们可能(或可能不)是线程切换的情况下,我经常使用它.例如: struct Foo { void bar() {} }; class BaseImpl { public: void CallBar(const std::shared_ptr<Foo>& f); { do_call_bar(f); } private: virtual void do_call_bar(const std::shared_ptr<Foo>& f) = 0; }; class DerivedDirectCall : public BaseImpl { virtual void do_call_bar(const std::shared_ptr<Foo>& f) override { f->bar(); } }; class DerivedAsyncCall : public BaseImpl { virtual void do_call_bar(const std::shared_ptr<Foo>& f) override { // assume invoke passes this off // to be done asynchronously invoke([f] () { f->bar(); }); } }; 根据实现是DerivedDirectCall还是DerivedAsyncCall,只有在必要时才会复制共享指针. 此外,上面的评论链接this article on smart pointers.我想明确的是,我的答案是专门关于传递智能指针本身.如果你知道生命周期不一定会被扩展,最好通过引用(或原始指针)传递指向的对象,但只需要允许nullptr参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |