簡體   English   中英

功能指針內存使用

[英]Function pointer memory usage

聲明一個函數指針需要多少內存。 指向類的成員函數的函數指針如何?

[編輯:]我想我的問題不清楚。 我知道指向成員函數的函數指針會占用更多的內存空間,我想知道為什么...

答案取決於平台。 您可以使用sizeof找到特定平台的答案。

指向成員函數的指針的大小可能不一定與常規函數指針的大小相同,因此您應該編寫測試以將它們兩者輸出:

#include <iostream>
using namespace std;
void foo() {}
struct C {
    void bar();
};
int main() {
    cout << sizeof(&foo) << endl;
    cout << sizeof(&C::bar) << endl;
    return 0;
}

演示。

這取決於實現,但是指向成員函數的指針通常占用與常規指針相同的空間,加上this指針的偏移量所占用的空間,通常與指針的大小相同。 因此,您希望指向成員函數的指針的大小是常規指針的兩倍。

考慮:

#include <iostream>
using namespace std;

class Base
{
    public:
    int q;
    Base() { ; }
    void BaseFunc () { cout << this << endl; }
};

class Derived : public Base
{
    public:
    int r;
    Derived() { ; }
    virtual void DerivedFunc () { cout << this << endl; }
};

int main ()
{
    Derived f;
    f.BaseFunc();
    f.DerivedFunc();
    void (*p1)();
    void (Derived::*p2)();

    cout << sizeof(p1) << " "  << sizeof(p2) << endl;
}

輸出示例:

0x7fffe4c3e328
0x7fffe4c3e320
8 16

因此,指向成員函數的指針必須存儲兩條信息-要調用的函數以及如何調整this指針以指向成員數據的右側部分。

對於那些認為可以根據類型來計算調節器的人,請嘗試以下main

int main ()
{
    Derived f;

    void (Derived::*p1)();
    p1 = &Derived::BaseFunc;
    (f.*p1)();
    p1 = &Derived::DerivedFunc;
    (f.*p1)();
}

(f.*p1)();的兩個調用(f.*p1)(); 即使類型相同,也需要不同的調節器。 而且,當然,與通過Derived::(*)()指針調用相同的函數BaseFunc通過Base::(*)()指針調用BaseFunc需要一個不同的調整器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM