我正在尝试使用 std::function 作为回调处理程序。
像这样,
void some_job( int arg1, std::function<void(int)> & callback )
{
callback( process(arg1) );
}
在此示例中,我使用了引用传递。
但问题是,我不能保证 std::function
对象 callback
仍然存在,因为该函数在我的程序中的异步上下文中执行。
所以我必须管理函数对象的生命周期,我想了两种方法。
使用值传递(复制)
使用
std::shared_ptr
我知道在我的系统中,std::function
的大小固定为 24 字节,而 std::shared_ptr
为 8。
但是复制 std::shared_ptr 会导致管理其引用计数器的额外开销。
(此外,我找不到任何聪明而简洁的方法来创建 std::function
的 shared_ptr 对象。)
哪种方式性能更好?
最佳答案
如果您的程序中时间要求很高,以至于您担心复制 24 字节还是 8 字节 + 共享开销更快,那么您将必须同时实现两者并使用探查器来找出在您的特定场景中哪个更好。在这种情况下,您还应该考虑一种完全不同的方法,该方法将绕过可能隐藏在 std::function::operator()
内的虚拟调用。
否则,我只需按值获取参数并让优化器完成其工作。
关于c++ - std::function 用于方法参数、复制还是shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975027/