0

我必须遵循代码:

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

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

它的正常用法是调用,

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

并且可以正常工作。

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

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

我认为以上信息应该足以给出一般性答案,但让我添加有关此“创建”功能的确切作用的信息。

调用 create() 的效果是使用 new 创建了一个对象“Signal”,其中 Signal 是:

struct Signal {
    signal_type mSignal;
};

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

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

当我必须“重新启动”计时器时(在它到期之前),我首先调用 cancel() 函数,然后再次调用 create()。函数 cancel() 有效地调用了 'delete 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;
}

这是否允许,或者对“连接”和删除的调用对“插槽”做一些事情,所以我不能在没有副作用的情况下重复使用它?

4

1 回答 1

1

一般来说,

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

    boost::function<void()> stored_bind = 
          boost::bind(&MyClass::fpp, boost::ref(object));
    
于 2014-11-15T12:18:21.310 回答