在函数中,哪一个“返回”更合适?A. vector<Foo>?B. shared_ptr<vector<Foor>>?换句话说,哪一个副本不那么重,你会怎么做,为什么?
vector<Foo>
shared_ptr<vector<Foor>>
wwtsj6pe1#
我认为返回shared_ptr<vector<T>>很少有用。我只会这样做,如果几个对象,其中持有一个共享的向量,他们可以操纵。对我来说,这表明了一个设计缺陷。一个更好的选择可能是通过const引用返回。这避免了(潜在的昂贵的)复制操作,但是不允许访问器改变向量。如果你返回一个本地的std::vector,你也可以通过参数返回它。如果您真的想返回shared_ptr<vector<T>>,请考虑shared_ptr<const vector<T>>是否可以完成这项工作(向量可以被许多人检查,但只能由所有者操作)。然而,A通常比B更昂贵,但返回值优化通常适用于这里。对于C++11,std::vector有一个移动构造函数,它将保证返回一个本地std::vector不需要昂贵的复制操作。记住,不要过早优化:)
shared_ptr<vector<T>>
std::vector
shared_ptr<const vector<T>>
deikduxw2#
返回shared_ptr<vector<Foo>>保证不会发生额外的复制。返回vector<Foo> * 可以 * 避免额外的复制,如果返回值优化(RVO)启动,或者如果使用C++11的移动语义。但是如果避免复制很重要,我不会使用这个(即使你可以确保这些优化总是可用的),因为我不认为使用return-a-copy语义而实际上意味着不复制是一个好主意。我可能会选择其中一个,但这取决于:
shared_ptr<vector<Foo>>
back_inserter
xoefb8l83#
在C03中,首选:1.如果提供对成员的访问,则通过常量引用返回。1.否则,如果返回一个局部变量,则使用out引用参数。在C11中,首选:1.如果提供对成员的访问,则通过常量引用返回。1.否则,如果返回一个本地值,则通过值返回,因为移动构造将避免过多的副本。您希望返回引用计数智能指针的情况是,具有不相交生存期的多个对象都希望访问该对象。这不是最常见的情况,但它经常发生。
3条答案
按热度按时间wwtsj6pe1#
我认为返回
shared_ptr<vector<T>>
很少有用。我只会这样做,如果几个对象,其中持有一个共享的向量,他们可以操纵。对我来说,这表明了一个设计缺陷。一个更好的选择可能是通过const引用返回。这避免了(潜在的昂贵的)复制操作,但是不允许访问器改变向量。如果你返回一个本地的
std::vector
,你也可以通过参数返回它。如果您真的想返回
shared_ptr<vector<T>>
,请考虑shared_ptr<const vector<T>>
是否可以完成这项工作(向量可以被许多人检查,但只能由所有者操作)。然而,A通常比B更昂贵,但返回值优化通常适用于这里。对于C++11,
std::vector
有一个移动构造函数,它将保证返回一个本地std::vector
不需要昂贵的复制操作。记住,不要过早优化:)
deikduxw2#
返回
shared_ptr<vector<Foo>>
保证不会发生额外的复制。返回
vector<Foo>
* 可以 * 避免额外的复制,如果返回值优化(RVO)启动,或者如果使用C++11的移动语义。但是如果避免复制很重要,我不会使用这个(即使你可以确保这些优化总是可用的),因为我不认为使用return-a-copy语义而实际上意味着不复制是一个好主意。我可能会选择其中一个,但这取决于:
vector<Foo>
的引用作为参数back_inserter
)xoefb8l83#
在C03中,首选:
1.如果提供对成员的访问,则通过常量引用返回。
1.否则,如果返回一个局部变量,则使用out引用参数。
在C11中,首选:
1.如果提供对成员的访问,则通过常量引用返回。
1.否则,如果返回一个本地值,则通过值返回,因为移动构造将避免过多的副本。
您希望返回引用计数智能指针的情况是,具有不相交生存期的多个对象都希望访问该对象。这不是最常见的情况,但它经常发生。