c++ - C++ boost 绑定(bind)性能

标签 c++ performance boost c++11 boost-bind

绑定(bind)函数(使用 Boost Bind)时是否有任何性能影响(正面或负面)?

最佳答案

也许,也许不是。这取决于。

std::bind(或 boost::bind)的结果是所谓的“绑定(bind)表达式”,它具有由执行。此类型是一个Callable,并且它可转换std::function(或boost::function).

在内部,函数(可能)使用类型删除来处理各种复杂的、有状态的“可调用对象”。在某些(但不一定是所有)情况下,这需要动态分配和虚拟调度。 bindfunction 都是有状态的,因为它们存储绑定(bind)参数。

结果是您应该尽可能避免将绑定(bind)表达式转换为 function 对象。 bind 表达式本身可能更便宜,您不应该害怕使用 bind(例如,将成员函数指针绑定(bind)到实例和参数时)。自由使用 bind,但仅当您确实需要管理可调用实体的异构集合时才转换为 function

这里有两个典型的例子:

不好;避免这种情况:

std::function<int(bool, char)> f = std::bind(&Foo::bar, x, 12);

void do_something(std::function<int()> func, int & acc)
{
    acc += func();
}

更好;更喜欢这个:

auto f = std::bind(&Foo::bar, x, 12);   // unknowable type, but perfectly fine

template <typename F>
void do_something(F && func, int & acc)  // can deduce unknowable types
{
    acc += func();
}

关于c++ - C++ boost 绑定(bind)性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446596/

相关文章:

c++ - 创建不依赖于对象的方法

c++ - 如何从 "STL"格式转换为 "3DS"

ruby-on-rails - 如何调试慢速 Rails 应用程序启动时间?

c++ - 使用 boost.asio 是否可以进行标记和空间奇偶校验?

c++ - MFC SDI 从 INI 读取并在更改属性时更新 View 字符串

java - 循环的简写是否缓存可迭代的引用?

java - 如何加快 Java VM (JVM) 的启动时间?

c++ - io_service::run() 永不返回

c++ - 使用 boost::serialization 序列化一个包含作为成员的 boost adjacency_list 的类

c++ - waf 在构建时指定库,但在配置时获取全名