搜尋

首頁  >  問答  >  主體

c++11 - c++ 如何获取成员函数的地址?

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; }
阿神阿神2803 天前629

全部回覆(3)我來回復

  • 阿神

    阿神2017-04-17 13:12:24

    這要分若干種情況。如果那隻是一個普通函數的話,那的確獲取的指標就是位址。如果那剛好是個虛函數,而且你的類別還包括若干個虛基類的話,那麼這個「指標」的大小可能有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*

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:12:24

    1. 是的。

    2. 動態函式庫的原理是只記錄函數的偏移量,在載入的時候,加上這個函式庫的起始位址,載入以後就固定了。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:12:24

    每次運行的位址不一樣,在一次運行中位址固定不變

    回覆
    0
  • 取消回覆