1.对象模型:关于vptr和vtbl
这个主题主要是关于vptr(virtual pointer)和vtbl(virtual table)底层的模型和内存中的存放。
看到vptr指向vtble,而vtable又存放了virtual functions的地址,方便调用。
又看到了当类与类继承的时候non-virtual member functions与virtual member functions 的相同点是当他们重载或者虚函数多态声明时函数虽同名但不同址,不同的是virtual functions的地址是单独存放在每个class的vptr指向的vtbl里的, 而non-virtual functions并没有。
小主题:关于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(动态绑定方法)。
2.重谈const
使用const的原因就是用户使用的考量,参考图中String这个例子。
还有一个原因就是linux中的copy on write(写时拷贝)。当不必考虑COW时可以采用const , 而考虑COW时必须移除const。
3.NEW 和 DELETE (谈谈NEW DELETE使用和重载)
注意: new 和 delete的重载可以多个,但是每个重载的参数必须互不相同,当new delete重载对程序的影响还是很大的。所以必须慎重考量而且尽量不要代替全局的new 和 delete(因为你写的不一定有那群C++大神写得好)。
接下来看看侯老师写的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的实例:
basic_string 使用new(extra)扩充申请量: