C++ std::方法参数、复制或共享的函数\u ptr?

C++ std::方法参数、复制或共享的函数\u ptr?,c++,shared-ptr,pass-by-value,std-function,C++,Shared Ptr,Pass By Value,Std Function,我正在尝试将std::function用作回调处理程序 像这样, void some_job( int arg1, std::function<void(int)> & callback ) { callback( process(arg1) ); } void some_job(int arg1,std::function&callback) { 回调(进程(arg1)); } 在这个例子中,我使用了passbyreference 但问

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

像这样,

void some_job( int arg1, std::function<void(int)> & callback )
{       
   callback( process(arg1) );
}
void some_job(int arg1,std::function&callback)
{       
回调(进程(arg1));
}
在这个例子中,我使用了passbyreference

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

所以我必须管理函数对象的生命周期,为此我考虑了两种方法

  • 使用按值传递(复制)

  • 使用
    std::shared\u ptr

  • 我知道在我的系统中,
    std::function
    的大小固定为24字节,
    std::shared\u ptr
    为8字节

    但是复制std::shared_ptr会导致管理其引用计数器的额外开销。 (此外,我找不到任何聪明而简洁的方法来创建
    std::function
    的共享\ptr对象)


    哪种方式的性能更好?

    如果您的程序中的一部分时间非常关键,以至于您担心复制24字节还是8字节+共享开销会更快,那么您必须同时实现这两种方式,并使用探查器找出在特定场景中哪一种更好。在这种情况下,您还应该考虑一种完全不同的方法,它将绕过虚拟调用(可能隐藏在<代码> STD:::函数:操作程序)(< /代码> .</P>)中。
    否则,我只需按值获取参数,并让优化人员完成其工作。

    只需按值复制参数,然后使用它即可。“哪种方法性能更好?”在实际运行场景中对其进行测量。但我会忽略价值,只有当它被证明是一个问题时才会考虑。托尼的答案几乎肯定是正确的。共享指针引用计数对于这个来说太重了。在您分析并演示性能问题之前,最好是复制,不要担心它。