【问题标题】:What is the advantage of passing by reference to shared_ptr over passing by reference directly通过引用传递给 shared_ptr 比直接通过引用传递有什么好处
【发布时间】:2016-12-18 20:24:38
【问题描述】:
class myMem{};

class Test{
public:
  initMem1(myMem& mInput){/*initialize _mem1*/}
  initMem2(shared_ptr<myMem> &pmInput){/*initialize _mem2*/}

  myMem _mem1;
  shared_ptr<myMem> _mem2;
};

Test myTest;
myTest()

因此,在上面的代码中,成员属于一个类。一个成员是值类型,另一个成员是 shared_ptr 类型。哪种方式更适合班级成员?此外,我还有初始化成员的功能。哪种方式更好?

一般来说,通过引用传递给 shared_ptr 比直接通过引用传递有什么优势?

【问题讨论】:

  • ...一个要求你有一个shared_ptr?
  • 问题应该是:“通过引用传递给shared_ptr 与直接通过值传递给shared_ptr 相比有什么优势?”答案是:更便宜。
  • 对于编译器来说,它们都是不同的类型。你不能真正比较苹果和橙子。 Test&amp;shared_ptr&lt;Test&gt;&amp; 不是相同的引用类型。至于从后者获得前者的性能成本,它可能只是额外间接的成本。但后者携带更多信息
  • 与您询问传递对指针的引用与传递对对象的引用的优势几乎相同的答案。如果要更改指向的对象,请引用指针。如果您只想更改对象本身,请使用直接引用;它更便宜并且限制更少..

标签: c++ c++11 reference shared-ptr smart-pointers


【解决方案1】:

函数应该接受std::shared_ptr 作为参数的唯一原因是它可能需要共享或修改资源的所有权。如果没有,请不要传递std::shared_ptr

如果函数肯定需要共享所有权,那么它应该按值接受std::shared_ptr。如果函数可能会或可能不会共享所有权,则仅接受 std::shared_ptr&amp;

如果函数不修改所有权,则将引用传递给资源,而不是std::shared_ptr

参见: CppCoreGuidelines: F.7R.30R.34R.35

【讨论】:

    【解决方案2】:

    让我们看看你的函数。对于initmem1,代码通常看起来像

    initMem1(myMem& mInput){ _mem1 = mInput; }
    

    我们可以看到赋值运算符的调用,它通常会复制所有 myMem 字段。

    对于initMem2,有两种情况

    1)

    initMem2(shared_ptr<myMem> &pmInput){
         _mem2 = pmInput;
     }
    

    您应该使用“initMem2(const shared_ptr &pmInput)”。这是一个很好的风格。 我们可以在这里看到快速初始化。只是复制链接。但是您会获得所有权共享。如果您在外面更改pmInput,那么_mem2 也会更改。 不需要复制 cunstructor。两个智能指针都持有唯一的对象。

    2)

    initMem2(const shared_ptr<myMem> &pmInput){ // of course, const
         _mem2.reset(*pmInput);
     }
    

    您使用最初从 pmInput 复制的新内容创建了一个新的 shared_ptr。 您可以独立更改pmInput_mem2。但是对于这个新的 shared_ptr 和复制构造函数调用,您会获得额外的“新/删除调用”。

    【讨论】:

      【解决方案3】:

      一个用例是原始shared_ptr 可以在函数中间更改其内容(可能是嵌套调用)并且函数已准备好并需要新内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 2020-05-14
        • 1970-01-01
        • 2012-04-14
        • 2018-05-28
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        相关资源
        最近更新 更多