我正在尝试使用std :: function作为回调处理程序。
像这样,
void some_job( int arg1, std::function<void(int)> & callback )
{
callback( process(arg1) );
}
在这个例子中,我使用了pass-by-reference。
但问题是,我无法保证std::function
对象callback
仍然存在,因为该函数在我的程序中的异步上下文中执行。
所以我必须管理函数对象的生命周期,我想到了两种方式。
使用传值(复制)
使用std::shared_ptr
我知道std::function
的大小在我的系统中以24字节固定,std::shared_ptr
为8。
但是复制std::shared_ptr
会导致管理其引用计数器的额外开销。
(此外,我找不到任何聪明而巧妙的方法来制作std::function
的shared_ptr对象。)
哪种方式会有更好的表现?
答案 0 :(得分:3)
如果你在如此时间关键你的程序的一部分,它担心你复制24字节或8字节+共享开销是否更快,你将不得不实现两者并使用探查器,找出在您的特定场景中哪个更好。在这种情况下,您还应该考虑一种完全不同的方法,它可以绕过可能隐藏在std::function::operator()
内的虚拟调用。
否则,我只是按值取参数,让优化器完成它的工作。