2

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

像这样,

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

在这个例子中,我使用了传递引用。

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

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

  1. 使用传值(复制)

  2. 使用std::shared_ptr

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

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

哪种方式在性能上会更好?

4

1 回答 1

3

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

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

于 2013-02-20T08:16:56.600 回答