问大家一道题:关于成员函数占多少内存
类的对象的内存布局,里面会有数据成员,但是没有函数成员(充其量里面可能有个vptr),难道类的成员函数本身不占内存?
这是第一个疑问,请教高手:成员函数不占内存吗?推而广之,一般的全局函数不占内存吗?如果占,那么函数该占多少内存,与什么有关(参数?还是函数体里的局部变量?)
第二个问题:
如果外层用一个int** 指针,去访问类的虚函数,我可以做到,但是无法访问类的normal函数,请问高人,能否做到:
#include <stdio.h>
typedef void (*PTRFUN)(void);//声明一个函数指针
class A
{
public:
int ia;
int ib;
void virtual fun1();//虚函数
void virtual fun2();
void virtual fun3();
void virtual fun4();
void fun5();//实函数,normal
A();
};
A::A()
{
ib=20;
ia=10;
}
void A::fun1()
{
printf("A::fun1()\n");
}
void A::fun2()
{
printf("A::fun2()\n");
}
void A::fun3()
{
printf("A::fun3()\n");
}
void A::fun4()
{
printf("A::fun4()\n");
}
void A::fun5()
{
printf("A::fun5()\n");
}
void main()
{
A b;
int **ptr=NULL;
ptr=(int **)&b;
PTRFUN ptrfun;
printf("ptr[0][0]=%d\n",(int)(ptr[0]));//这是强行解释vptr,没什么意义
printf("ptr[0][2]=%d\n",(int)(ptr[1]));//访问ia
printf("ptr[0][3]=%d\n",(int)(ptr[2]));//访问ib
//这是强行解释之后的编码,我是边调试边写的,顺便就能得出b的内存布局来
//这样能访问虚函数们
ptrfun=(PTRFUN)(ptr[0][0]);
ptrfun();//访问fun1
ptrfun=(PTRFUN)(ptr[0][1]);
ptrfun();//访问fun2
ptrfun=(PTRFUN)(ptr[0][2]);
ptrfun();//访问fun3
ptrfun=(PTRFUN)(ptr[0][3]);
ptrfun();//访问fun4
//我该如何访问fun5?
}
上面这个,如何通过ptr来访问fun5?是不是因为fun5不在对象内存中,因此无法访问得到?
请真正的高手进来解答我的疑问
(注:上面的代码,我采用了一种“投机取巧”的方式,那就是int和int*占的内存大小一样大。。。。要不然,收不到效果的)
我用的VC6.0+XP32位系统