boost::bind在构造函数对象时,实参传递是采用传值方式的,中间会经过若干次的拷贝构造。对于不允许拷贝构造或拷贝构造性能开销较大的情形可以结合boost::ref增加一个wrapper层避免拷贝构造。下面是示例代码:
#include <iostream> #include "boost/bind.hpp" #include "boost/ref.hpp" struct A { A(int aValue) : m_value(aValue) { std::cout << "A()" << std::endl; } A(const A& a) { std::cout << "A(const A&)" << std::endl; this->m_value = a.m_value; } int m_value; }; void f(A a) { std::cout << "f(A)" << std::endl; } void g(A& a) { std::cout << "g(A&)" << std::endl; } int main() { A a(10); std::cout << "...f1..." << std::endl; boost::bind(&f, a)(); std::cout << "...f2..." << std::endl; boost::bind(&f, boost::ref(a))(); std::cout << "...g1..." << std::endl; boost::bind(&g, a)(); std::cout << "...g2..." << std::endl; boost::bind(&g, boost::ref(a))(); return 0; }
输出:
A()
...f1...A(const A&)A(const A&)A(const A&)A(const A&)A(const A&)A(const A&)f(A)...f2...A(const A&)f(A)...g1...A(const A&)A(const A&)A(const A&)A(const A&)A(const A&)g(A&)...g2...g(A&)