之前一直很在意,std::bind会不会引入一些变量生命周期导致的问题呢?于是进行了以下测试,主要想了解以下几点:

  1. 被std::bind绑定的变量生命周期是怎么样的?
  2. 如何降低std::bind绑定过程的消耗?
  3. 使用std::function 来进行保存的会是怎样?

以下Test主要考察1,2两点,而Test2主要考察第三点。

运行结果如下:

观察运行结果可以得出以下的结论:
Test1:

  1. std::bind是通过复制一个绑定的对象,使得对象生命周期与std::bind生成的函数对象相同。
  2. 当要调用的函数没有使用传引用方式时,绑定过程会调用2次复制构造函数(追记:函数调用时的额外一次,跟std::bind无关),反之1次。
  3. 复制构造函数的调用可以通过std::move转变成移动构造函数
  4. std::bind无法绑定使用&&(完美转发?)的参数。

Test2:

  1. function<>也是在自己里面保存了一个std::bind产生的函数对象。
  2. 里面并没有采用shared_ptr相关的。
  3. 记得用std::move~(虽然似乎对于小对象也没什么区别吧)

 

PS1:说起来在std::bind的实现中大部分地方都是用完美转发的,只有传给Tuple<>进行对象的保存时会调用构造函数的…(这样说来调用两次构造函数有一次不是std::bind的锅啊…..失算)

PS2:似乎std::bind与lambda表达式的变量捕获共同使用有时会出问题,原因不明,建议拿std::function打个包…