C++ 对象成员变量和成员函数的内存模型及权限
1.class 中的成员函数与成员变量是分开存放的
2.成员函数在内存中的位置
所有对象共享类中的成员函数,成员函数是函数,只可能存放在代码段里。
3.成员变量在内存中的位置
每个对象有独立的成员变量,成员变量是数据,数据只可能存放在栈空间(运行时)、堆空间(运行时)、全局数据区这三个区域。
运行时的对象退化为结构体的形式,所有成员变量在内存中像结构体中的一样依次排布,遵循内存对齐,可以通过内存地址直接访问成员变量。
4.如何区分权限
访问权限关键字在运行时失效,private 和 protected 的访问权限仅在编译时候有效。C++ 编译器在编译成员函数调用的时候,隐藏的传递了对象的地址,在成员函数的内部有了这个隐藏的地址当然可以直接访问对象的成员变量。(即编译时区分)
5.虚函数,虚表和虚指针
C++中,一个类存在虚函数,那么编译器就会为这个类生成一个虚函数表,在虚函数表里存放的是这个类所有虚函数的地址。虚函数表是属于类,类的所有对象共享这个类的虚函数表。
当生成类对象的时候,编译器会自动的将类对象的前四个字节设置为虚表的地址,而这四个字节就可以看作是一个指向虚函数表的指针。虚函数表可以看做一个函数指针数组。