非静态/静态成员函数都放置在所有的类对象之外
虚函数存放分为两个步骤:
-
1.每一个类为每一个虚函数都分别产生一个虚函数的指针,然后将这些指针放在一个虚函数表中(virtual table,vtbl)。虚函数表的第一个位置存放着所指对象的类型,用于运行时类型识别(runtime type identification,RTTI)
-
2.每一个类在内部添加一个指针(vptr),该指针指向于虚函数表
-
下面是上面Point类的对象模型:
优点:
提高了空间和存取时间的效率
缺点:
如果类的非静态数据成员有所修改(增加、移除、修改),那么整个应用程序需要重新编译
三、有继承下的C++对象模型
有继承关系下,C++对象模型的规则如下:
-
创建一个表,表中存放着指向基类的指针,然后派生类中又存放着这个表的指针
-
如果有虚继承,因为虚继承中只保存一份基类的实例,因此虚继承的子类所属的继承表中都指向同一个基类
class istream:virtual public ios{}; //虚继承
class ostream:virtual public ios{}; //虚继承
class iostream:public istream,public ostream{};
三、对象模型如何影响程序
-
不同的对象模型,会导致“现有的程序代码必须修改”以及“必须加入新的程序代码”两个结果
-
例如class X定义了一个拷贝构造函数、一个虚析构函数、一个虚函数foo
X foobar()
X xx;
X *px = new X;
xx.foo();
px->foo();
delete px;
return xx;
- 因此我们可以将上面的代码在内部可能会被转换为如下形式(我们会在后面的文章详细介绍每一步操作的用意):
X foobar()
//构造_result
//_result用来取代local xx
_result.X::X();
//扩展X *px=new X;
px = _new(sizeof(X));
if (px != 0)
px->X::X();
//扩展xx.foo()但不使用virtual机制
//以_result取代xx
foo(&_result);
//使用virtual机制扩展px->foo()
(*px->vtbl[2])(px);
//扩展delete px
if (px != 0){
(*px->vtbl[1])(px);
_delete(px);
//不需要named return statement
//不需要摧毁local objext xx
return;
Inside the C++ Object Model 深度探索对象模型 5-7
5构造,解构,拷贝语意学 Semantics of Construction, Destruction, Copy纯虚拟函数的存在 Presence of Pure VF>pure virtual function可以被定义和调用invoke: 只能被静态调用statically, 不能经由虚拟机调用; Ex. inline void Abstract_base::interface() const {...} Abstract_base::interface();>pure virtual destructor一定要定义, 每一个derived class destructor会 Read More
einsum学习笔记 python learn-python
医药统计项目可联系QQ:231469242 http://www.kancloud.cn/wizardforcel/scipy-lecture-notes/129882In [5]:%matplotlib inline
import numpy as np作者: Fabian Pedregosa, Gael Varoquaux先决条件Numpy, Sci