gpt4 book ai didi

c++ - 将成员函数绑定(bind)到局部静态变量

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:26 24 4
gpt4 key购买 nike

前提条件:

这是一个函数:

typedef std::function<void (int)> Handler;
void g(const Handler& h) {
h(100);
}

和一个类:

class A {
public:
void f0(int n) {
std::cout << m + n << std::endl;
}

void f1() {
::g(std::bind(&A::f0, this, std::placeholders::_1));
}

int m;
};

这将打印两行,“101”和“102”:

int main() {
A a1;
a1.m = 1;
a1.f1();

A a2;
a2.m = 2;
a2.f1();

return 0;
}

现在我意识到 A::f1() 会被非常频繁地调用,
所以我像这样修改它(新版本):

  void A::f1() {
static const Handler kHandler =
std::bind(&A::f0, this, std::placeholders::_1);

::g(kHandler);
}

我的问题:

this 指针绑定(bind)到局部静态变量是否安全?

两个版本在功能上没有区别吗?

我可以期待新版本真的会获得一些性能优势吗?
(我怀疑我的编译器(MSVC)会自己优化它,
所以我可能不需要自己优化它)。

已编辑 ----------

我运行新版本,发现结果和原来的不一样。
它再次打印两行“101”和“101”(不是“102”)。
可怜的问题,对不起所有人。

已编辑 2 ----------

请引用我可能真正想要的新问题:
Binding member function to a member variable

最佳答案

不,这不安全(也不能按预期工作)。静态变量在所有实例之间共享到A , 然后你绑定(bind) this在这个静态函数对象中 kHandler打电话时 f1首次。所以绑定(bind)参数总是等于你调用f1的实例首先,即在你的情况下 a1 .

和这个函数基本一样:

int f(int a) {
static int b = a;
return b;
}

多次调用该函数,总会得到第一次调用的值。 ( Demo )

备选方案:

  • 不过,如果您可以忍受空间开销,您可以为绑定(bind)函数使用成员变量。我想实现这个很简单。

  • 一个非线程安全的替代方案(我推荐使用这个!)可能是将“this”指针存储在一个静态成员中变量(“that”)并生成 f0 static 并使用“that”而不是“this”:

    class A {
    static A * that = nullptr;

    public:
    static void f0(int n) {
    assert(that);
    std::cout << that->m + n << std::endl;
    }

    void f1() {
    assert(!that);
    that = this;
    ::g(&A::f0);
    that = nullptr;
    }

    int m;
    };

关于c++ - 将成员函数绑定(bind)到局部静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26540615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com