繁体   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