【问题标题】:std::function for method argument, copy or shared_ptr?std::function 用于方法参数、复制还是 shared_ptr?
【发布时间】:2013-02-05 04:04:06
【问题描述】:

我正在尝试使用 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 会导致管理其引用计数器的额外开销。 (此外,我找不到任何巧妙而简洁的方法来制作 std::function 的 shared_ptr 对象。)

哪种方式性能更好?

【问题讨论】:

  • 按值复制即可。
  • "哪种方式的性能更好?"在真实的运行场景中对其进行测量。但我会按价值传递,只有在证明是一个问题时才考虑它。
  • 托尼的回答几乎肯定是正确的。共享指针引用计数对于这个来说太重了。在您分析并证明性能问题之前,您最好复制而不担心它。

标签: c++ shared-ptr pass-by-value std-function


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2014-01-03
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多