gpt4 book ai didi

c++ - 重用 boost::bind 调用的返回值的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 06:34:40 25 4
gpt4 key购买 nike

我必须遵循以下代码:

class Timer;
typedef boost::signals2::signal<void (void)> signal_type;

void Timer::create(long expiration, signal_type::slot_type const& slot);

that的正常用法是调用,

timer.create(2000, boost::bind(&some_callback));

并且可以正常工作。

但是,现在我需要经常“重启”这个计时器,这将需要对 boost::bind(&some_callback) 进行大量调用——我不想这样做,因为这似乎是对 CPU 的浪费。

我想调用 boost::bind 一次,然后重用它在后续调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟的是,使用释放的内存并崩溃或其他什么。

我认为以上信息应该足以给出一个一般性的答案,但让我补充一下这个“创建”函数到底做了什么。

调用 create() 的效果是用 new 创建了一个对象 'Signal',信号在哪里:

struct Signal {
signal_type mSignal;
};

然后 mSignal 连接到传递给创建的插槽值:

mCallback = new Signal;
mCallback->mSignal.connect(slot);

当我必须“重启”计时器(在它到期之前)时,我首先调用cancel() 函数,然后再次调用 create()。函数取消()有效地调用“删除 mCallback” - 所以,不做任何其他事情而不是释放由上面的"new"调用分配的内存。

因此,我想存储 boost::bind 的返回值并有效地重复使用它归结为:

signal_type::slot_type slot(boost::bind(&callback));
while (--several_times)
{
signal_type* signal = new signal_type;
signal->connect(slot);
delete signal;
}

这是允许的,还是对“连接”和删除的调用对“插槽”做了一些事情,这样我就不能在没有副作用的情况下重用它?

最佳答案

一般来说,

  • 绑定(bind)表达式非常轻量级(编译器通常会内联整个 shebang)
  • 绑定(bind)表达式确实复制它们的绑定(bind)参数,但是这很容易通过做 boost::bind(&MyClass::fpp, 来缓解<强> boost::ref ( object))
  • boost::function<>std::function<>非常适合存储绑定(bind)表达式:

    boost::function<void()> stored_bind = 
    boost::bind(&MyClass::fpp, boost::ref(object));

关于c++ - 重用 boost::bind 调用的返回值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com