【问题标题】:What is the correct way to reuse the return value of a boost::bind call?重用 boost::bind 调用的返回值的正确方法是什么?
【发布时间】:2014-11-14 22:45:38
【问题描述】:

我必须遵循以下代码:

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连接到传递给create的槽值:

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

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

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

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

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

【问题讨论】:

  • "但是,现在我需要'重新启动'这个计时器很多,这将需要大量调用 boost::bind(&some_callback) -- 我不想这样做,因为看起来很浪费CPU。” boost::bind 的魔力是在编译时完成的;您无需支付额外的 CPU 周期来再次绑定它。

标签: c++ boost boost-bind boost-signals2


【解决方案1】:

一般来说,

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

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

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2022-08-16
    • 1970-01-01
    • 2013-10-05
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-11-19
    相关资源
    最近更新 更多