C++ std::方法参数、复制或共享的函数\u ptr?
我正在尝试将std::function用作回调处理程序 像这样,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 但问
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>)中。
否则,我只需按值获取参数,并让优化人员完成其工作。只需按值复制参数,然后使用它即可。“哪种方法性能更好?”在实际运行场景中对其进行测量。但我会忽略价值,只有当它被证明是一个问题时才会考虑。托尼的答案几乎肯定是正确的。共享指针引用计数对于这个来说太重了。在您分析并演示性能问题之前,最好是复制,不要担心它。