前提条件:
这是一个功能:
typedef std::function<void (int)> Handler;
void g(const Handler& h) {
h(100);
}
,和一个类(原始版本):
class A {
public:
A(int arg)
: m(arg) {}
void f0(int n) {
std::cout << m + n << std::endl;
}
void f() {
::g(std::bind(&A::f0, this, std::placeholders::_1));
}
private:
const int m;
};
这将打印两行,'101'和'102':
int main() {
A a1(1);
a1.f();
A a2(2);
a2.f();
return 0;
}
现在我意识到A::f()
将被频繁调用,
所以我修改了它(新版本):
class A {
public:
A(int arg)
: m(arg),
handler(std::bind(&A::f0, this, std::placeholders::_1)) {}
void f0(int n) {
std::cout << m + n << std::endl;
}
void f() {
::g(handler);
}
private:
const int m;
const Handler handler;
};
我的问题:
将this
指针绑定到成员变量是否安全?
两个版本之间是否存在功能差异?
我可以期待新版本真正获得一些性能优势吗?
(我怀疑我的编译器(MSVC)会自行优化它,
所以我可能不需要自己优化它。)
PS。:这个问题纠正并取代了之前的问题: Binding member function to a local static variable
答案 0 :(得分:1)
正如Igor Tandetnik在评论中提到的那样:
将此指针绑定到成员变量是否安全?
注意编译器生成的复制构造函数和赋值运算符。考虑:
A a(42); A b = a;
此处,
b.handler
仍然引用&a
,而不是&b
。这可能是也可能不是你想要的。
我也不认为性能优势需要花费时间来维护成员变量。 (*)