前提条件:
这是一个函数:
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
指针绑定(bind)到一个成员变量是否安全?
两个版本在功能上没有区别吗?
我可以期待新版本真的会获得一些性能优势吗?
(我怀疑我的编译器(MSVC)会自己优化它,
所以我可能不需要自己优化它)。
PS.: 本题更正并替换上一题: Binding member function to a local static variable
最佳答案
正如 Igor Tandetnik 在评论中提到的:
Is it safe to bind this pointer to a member variable?
当心编译器生成的复制构造函数和赋值运算符。考虑:
A a(42); A b = a;
这里的
b.handler
还是指&a
,不是&b
。这可能是也可能不是您想要的。
我也不认为性能优势值得开发时间维护成员变量。 (*)
关于c++ - 绑定(bind)成员函数到成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541667/