GeekBand C++面向对象高级编程(下) 笔记&心得 2

1.对象模型:关于vptr和vtbl

这个主题主要是关于vptr(virtual pointer)和vtbl(virtual table)底层的模型和内存中的存放。


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第1张图片
对象模型  布局调用1


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第2张图片
对象模型  布局调用2

看到vptr指向vtble,而vtable又存放了virtual functions的地址,方便调用。

又看到了当类与类继承的时候non-virtual member functions与virtual member functions 的相同点是当他们重载或者虚函数多态声明时函数虽同名但不同址,不同的是virtual functions的地址是单独存放在每个class的vptr指向的vtbl里的, 而non-virtual functions并没有。

小主题:关于this


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第3张图片
关于this

图是MFC的一个method。重要的是侯老师写的this->serialize(); 等同于 (*(this->vptr)[n])(this)。 简单解释下(*(this->vptr)[n])(this),这段语句的意思是调用vbtl中的第n个virtual function。*(this->vptr)等同于:        取到vbtl,然后选择第[n]个,就是(*(this->vptr)[n]),接下来取到这个(就是第n个)的this。  这个就是一个dynamic binding(动态绑定方法)。


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第4张图片
动态绑定的汇编代码1


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第5张图片
动态绑定汇编代码2

2.重谈const



GeekBand C++面向对象高级编程(下) 笔记&心得 2_第6张图片
const的基本属性

使用const的原因就是用户使用的考量,参考图中String这个例子。

还有一个原因就是linux中的copy on write(写时拷贝)。当不必考虑COW时可以采用const , 而考虑COW时必须移除const。

3.NEW 和 DELETE (谈谈NEW DELETE使用和重载)


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第7张图片
new 和 DELETE之前的内容概览


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第8张图片
new 和 DELETE的重载

注意: new 和 delete的重载可以多个,但是每个重载的参数必须互不相同,当new delete重载对程序的影响还是很大的。所以必须慎重考量而且尽量不要代替全局的new 和 delete(因为你写的不一定有那群C++大神写得好)。

接下来看看侯老师写的new delete重载较完整的代码:


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第9张图片
代码1


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第10张图片
接口,代码


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第11张图片
调用,结果

看看如果使用重载后我希望使用全局new 和 delete的方法吧:

GeekBand C++面向对象高级编程(下) 笔记&心得 2_第12张图片
全局使用new和delete的方法

使用::new 和 ::delete就可以使用全局方法来代替局部方法。

也可以重载operator new(),重载的要点:

1. 每个版本声明必须要有独特的参数列

2.第一个参数必须是size_t,其余的参数以new所指定 的placement arguments为初值

同时也可以重载operator delete(),但他们不会被delete调用。只有当new所调用的ctor抛出exception时才会调用这些重载的operator delete()。


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第13张图片
重载要点

下面看看重载operator new 和 operator delete的实例:


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第14张图片
实例1


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第15张图片
实例2





basic_string 使用new(extra)扩充申请量:


GeekBand C++面向对象高级编程(下) 笔记&心得 2_第16张图片
basic_string 使用new(extra)扩充申请量

你可能感兴趣的:(GeekBand C++面向对象高级编程(下) 笔记&心得 2)