函数指针内存使用
Function pointer memory usage
声明一个函数指针需要多少内存。指向class的成员函数的函数指针怎么样?
[编辑:]我想我的问题不清楚。我知道指向成员函数的函数指针占用更多内存 space,我想知道为什么...
答案取决于平台。您可以使用 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;
}
这取决于实现,但通常指向成员函数的指针占用的 space 与常规指针占用的数量相同,加上 space 到 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)();
的两次调用也需要不同的调节器。当然,通过 Base::(*)()
指针调用 BaseFunc
与通过 Derived::(*)()
指针调用相同函数需要不同的调节器。
声明一个函数指针需要多少内存。指向class的成员函数的函数指针怎么样?
[编辑:]我想我的问题不清楚。我知道指向成员函数的函数指针占用更多内存 space,我想知道为什么...
答案取决于平台。您可以使用 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;
}
这取决于实现,但通常指向成员函数的指针占用的 space 与常规指针占用的数量相同,加上 space 到 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)();
的两次调用也需要不同的调节器。当然,通过 Base::(*)()
指针调用 BaseFunc
与通过 Derived::(*)()
指针调用相同函数需要不同的调节器。