《深度搜索C++对象模型》的一些学习纪要:
原文链接:ordeder http://blog.csdn.net/ordeder/article/details/26396989
一成员变量篇
0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理;
1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量;
2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中;
3. 继承中,基类保持者自己在内存对象的格局,对象格局的填充位不被派生类的成员所格局占用(防止不必要的数据覆盖);
4. 虚继承中,将派生类中的成员分为确定部分和共享部分,其中共享部分为基类的成员印象,通常通过指针加上偏移量来标志这块共享区域,虚继承对象对共享块的范围过程中涉及到了间接性访问,影响程序效率;
5. 基类如果有虚函数,那么基类必然就有一个额外的内部指针vptr指向一个虚函数表,在继承中,这个vptr和虚函数是和成员变量一样被继承,而且在内存格局中,vptr在格局的首部或者尾部。
6. 多态是通过虚函数指针实现的,但是说白了就是函数指针罢了。其中要理解一个重要的概念是:指针类型决定了程序对一块内存区域的解析;
值得看懂的图:
图1: 继承中的基类的padding是不会在派生类中被利用的,故而每次多继承中可能会产生额外的填充位
二成员函数篇
7. 非静态成员函数,在编译过程中将被编译为如下形式:
a. 成员函数最终被编译为一个外部函数
b. 这个外部函数的名字由成员函数名+类名+参数列表构造而成,这样重载函数将不会重名
c. 这个外部函数的参数将固有多出两个参数,一个是this指针,作为类对象的指针,他是该对象的数据通道。
d. 另一个是result指针,该指针将成员函数的return的返回类型改造为指针传入的形式,而全局函数的返回类型为void
e. 成员函数的末尾如果有const修饰,那么在外部函数中将体现为对this指针的修饰。(const classname const * this)
8. 虚函数的的实现机制为前文第5点说明了,且注意,虚函数表中的虚函数指针指向的虚函数同样被编译器进行了处理,处理方式和第7点的方法类似,同样在参数类表中有this指针作为对象数据通道;
9. 静态成员函数,为了控制静态成员而引入的,静态成员函数不能对非静态成员变量进行访问,这是因为:静态成员函数不具备也不需要对象的this指针作为数据通道。人家管理的是类的静态变量,该静态变量是存储于全局数据段中的,而不是在任何数据对象中的嘛!
所以它有一下特点:
a. 不能直接存储器class中的非静态成员变量
b. 不能够被生命为 const\volatite\或者virtual
c. 不需要经过 class 对象才被调用,调用的方法有:class::static_fun() 或者 class_obj.static_fun()
C++面向对象—成员函数与成员变量的实现机制学习笔记(1)