c++11 - c++ 如何获取成员函数的地址?
阿神
阿神 2017-04-17 13:10:24
0
3
621

1.比如如下代码, FuncA是类A的成员函数, 那么&f1FuncA这个函数的地址么?

    function<void (int)> f1;
    A a;
    auto fun = std::bind(&A::FuncA, a, std::placeholders::_1);
    f1 = fun;

2.对于这个函数的地址, 有没有可能是变化的? 其实我是想知道, 可执行程序在运行的时候,会加载很多动态库

那么, 这个加载的过程是动态的(这时候函数的地址肯定不一样了) 还是只加载一次(函数地址固定)?

更新一个问题, 详细见1L评论.

类A里面有我的待测函数toBeTest, 单元测试的时候,里面调用了func
而后者这个函数里面有一堆调用了第三方或者系统函数,不方便mock或者成本太高.
那么,看到有人给出的一种方案是A中构造一个mock_func的打桩的函数, ut执行 的时候取两个函数的地址,替换一下。
也就是原来调用func的地方都调用mock_func ut只测试了关心的部分.

这种场景下, 还有别的什么方案么?

mock_func(){

return true; }
阿神
阿神

闭关修行中......

membalas semua(3)
阿神

这要分若干种情况。如果那只是一个普通函数的话,那的确获取的指针就是地址。如果那恰好是一个虚函数,而且你的类还包括若干个虚基类的话,那么这个“指针”的大小可能有4sizeof(void)这么多,里面记录了很多数据,包括如何从这个类的指针转到孙类指针,如何在虚表上寻找对应的slot等等。

在这里要普及一个知识。如果我的程序这么写:

class A
{
public:
    virtual void F();
};

class B : public A
{
public:
    void F()override;
};

class C : public A
{
public:
    void F()override;
};

那么

auto pf = &A::F;
A* b = new B();
A* c = new C();
(b->pf)(); // 将会调用B::F
(c->pf)(); // 将会调用C::F

为了完成这样的功能,pf肯定不是一个void*结构这么简单的东西。所以这就是为什么C++不允许你把成员函数的指针在任何条件下强制转换成void*

黄舟
  1. 是的。

  2. 动态库的原理是只记录函数的偏移量,在加载的时候,加上这个库的起始地址,加载以后就固定了。

洪涛

每次运行的地址不一样,在一次运行中地址固定不变

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan