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

2016-11-07  本文已影响0人  复杂也不复杂的Mr囚

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

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

对象模型  布局调用1 对象模型  布局调用2

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

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

小主题:关于this


关于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(动态绑定方法)。

动态绑定的汇编代码1 动态绑定汇编代码2

2.重谈const



const的基本属性

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

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

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

new 和 DELETE之前的内容概览 new 和 DELETE的重载

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

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

代码1 接口,代码 调用,结果

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

全局使用new和delete的方法

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

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

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

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

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


重载要点

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

实例1 实例2

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

basic_string 使用new(extra)扩充申请量
上一篇 下一篇

猜你喜欢

热点阅读