3 回答
TA贡献1874条经验 获得超12个赞
Scott,Andrei和Herb 在C ++和Beyond 2011的“ 任何问题”会议上都讨论并回答了这个问题。从4:34 开始观看性能和正确性。shared_ptr
不久,没有理由按值传递,除非目标是共享对象的所有权(例如,在不同的数据结构之间或在不同的线程之间)。
除非您可以按照上面链接的视频中Scott Meyers的说明进行移动优化,但这与您可以使用的C ++的实际版本有关。
在GoingNative 2012会议的“ 互动小组:任何问题!”中对该讨论进行了重大更新。值得一看,尤其是从22:50开始。
TA贡献1799条经验 获得超6个赞
这是赫伯·萨特的
准则:除非您要使用或操纵智能指针本身,例如共享或转让所有权,否则不要将智能指针作为函数参数传递。
准则:表示函数将使用按值shared_ptr参数存储和共享堆对象的所有权。
准则:仅使用非常量shared_ptr&参数来修改shared_ptr。仅在不确定是否要复制并共享所有权时,才使用const shared_ptr&作为参数。否则,请改用widget *(或者,如果不能为null,则使用widget&)。
TA贡献1835条经验 获得超7个赞
我跑到下面的代码,一旦与foo服用shared_ptr的const&,并再次foo取shared_ptr的值。
void foo(const std::shared_ptr<int>& p)
{
static int x = 0;
*p = ++x;
}
int main()
{
auto p = std::make_shared<int>();
auto start = clock();
for (int i = 0; i < 10000000; ++i)
{
foo(p);
}
std::cout << "Took " << clock() - start << " ms" << std::endl;
}
在我的Intel Core 2 Quad(2.4GHz)处理器上使用VS2015,x86版本构建
const shared_ptr& - 10ms
shared_ptr - 281ms
按值复制版本要慢一个数量级。
如果要从当前线程同步调用函数,请选择const&版本。
- 3 回答
- 0 关注
- 1246 浏览
添加回答
举报