类中成员变量和成员函数在内存中的地址

#include <iostream>
using namespace std;

class Test
{
public:
 int a;
 int b;
 void print();
 void s();
 void ss();
 void fs();
};
void Test::print()
{
 //cout << "hello" << endl;
}

void Test::s()
{

}

void Test::ss()
{

}
void Test::fs()
{

}


void f()
{
 int s = 3;
 cout << "&s" << &s << endl;
 cout << "f" << endl;
}

class B:Test
{

};

int main()
{
 Test t;
 cout << sizeof(t) << endl;
 cout << &t.a << endl;
 cout << &t.b << endl;
 Test tt;
 cout << &tt.a << endl;
 cout << &tt.b << endl;
 typedef void (Test::*p)(void);
 ////Test t;
 ////t.print();
 p fun = &Test::print;
 printf("%p\n",fun);
 fun = &Test::s;
 printf("%p\n",fun);

 fun = &Test::ss;
 printf("%p\n",fun);
 fun = &Test::fs;
 printf("%p\n",fun);
 f();
 cout << "--------" << endl;
 B b;
 cout << sizeof(b) << endl;
 ////((Test::*print)fun)();
 //Test *p4;
 //fun(p4);
 //  Test t;
 //  (t.*fun)();
 //  Test d;
 //  (d.*fun)();
}


类的成员函数不是在类实例化的时候载入内存的。应该是编译链接的时候就在程序文件中确定了相对地址。然后程序载入的时候,所有的函数都载入到内存的代码区。所以实例化对象的时候,只是申请了对象的成员变量的地址,成员函数对于所有的类对象来说,应该只有一份,在代码区共用。而且类的成员变量和成员函数不是存放在一起(地址不是连续的,是分开存放的)
Test类中的a,b变量地址是连续的,每个占4字节。但是s(),ss(),fs()不是和a,b连续的,而且,这些函数之间,好像也并不是严格连续的,改一下函数名,地址有可能会变化

posted on 2011-03-25 19:57 MrRightLeft 阅读(1063) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜