std :: function for method argument,copy或shared_ptr?

时间:2013-02-20 08:09:26

标签: c++ shared-ptr pass-by-value std-function

我正在尝试使用std :: function作为回调处理程序。

像这样,

void some_job( int arg1, std::function<void(int)> & callback )
{       
   callback( process(arg1) );
}

在这个例子中,我使用了pass-by-reference。

但问题是,我无法保证std::function对象callback仍然存在,因为该函数在我的程序中的异步上下文中执行。

所以我必须管理函数对象的生命周期,我想到了两种方式。

  1. 使用传值(复制)

  2. 使用std::shared_ptr

  3. 我知道std::function的大小在我的系统中以24字节固定,std::shared_ptr为8。

    但是复制std::shared_ptr会导致管理其引用计数器的额外开销。 (此外,我找不到任何聪明而巧妙的方法来制作std::function的shared_ptr对象。)

    哪种方式会有更好的表现?

1 个答案:

答案 0 :(得分:3)

如果你在如此时间关键你的程序的一部分,它担心你复制24字节或8字节+共享开销是否更快,你将不得不实现两者并使用探查器,找出在您的特定场景中哪个更好。在这种情况下,您还应该考虑一种完全不同的方法,它可以绕过可能隐藏在std::function::operator()内的虚拟调用。

否则,我只是按值取参数,让优化器完成它的工作。