c++ - std::function 用于方法参数、复制还是shared_ptr?

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

我正在尝试使用 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 对象。)

哪种方式性能更好?

最佳答案

如果您的程序中时间要求很高,以至于您担心复制 24 字节还是 8 字节 + 共享开销更快,那么您将必须同时实现两者并使用探查器来找出在您的特定场景中哪个更好。在这种情况下,您还应该考虑一种完全不同的方法,该方法将绕过可能隐藏在 std::function::operator() 内的虚拟调用。

否则,我只需按值获取参数并让优化器完成其工作。

关于c++ - std::function 用于方法参数、复制还是shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975027/

相关文章:

c++ - .h 文件中的数组声明是个好主意吗?

c++ - Boost::Geometry:如何在 multi_polygon 中连接相交的多边形?

c++ - 如何在 C++ 中将 std::string 转换为 const char

php - 使用 SWIG 在 PHP 中包装 boost::shared_ptr

php - 出于速度和效率目的通过引用传递参数

javascript - .click() 回调引用调用方法中的局部变量,而不是按值复制

c++ - 哪种数据结构更适合用于查找句子是否包含唯一字符?

c++ - 智能指针和复制构造函数

c++ - 什么时候使用虚拟析构函数?

javascript - 在javascript中,下面的代码是如何工作的