<深入探索c++对象模型> 第一章读书笔记
内存模型
data members包含在每一个object中, 同一个class的实例都只有一个member functions,但是inline function包含在object中。
实际上每个class都有自己独立的member funtions,继承而来的member function也会在object存放一个独立地址。
c++相比c开销大,主要是支持virtual:(1)支持virtual funtion。(2)支持virtual base class。
3个c++的内存模型:
(1)A Simple Object Model: 一个object是一系列的slot的集合,每个data member和member funtion都在object中自己的slot。
(2)A Table-Driven Object Model: 为data member,member funtions分别建立一张表,每个object中存放2个表的地址的指针。
(3)The c++ Object Model: object中存放no-static data members和虚函数表vtbl的指针vptr。其他的如static data members, static member functions, no-static member funtions 均放在object外面, virtual funtions在单独放在vtbl一张表中,表格的开始存放type-info。对于inherit,base class object 和derive class object中分别存放的是自己的vtbl的vptr。
在多态的指针或引用中,即便子列的vtbl中是包含父类的virtual function的slots。而不是说子类部分有一个vptr指向自己的vtbl,父类部分有一个vptr指向自己的vtbl。
对于c的struct,c++中最好是使用compsition, 而不是使用inherit,在inherit的时候,取出的数据空间受到vptr和data members的影响。
polymorphic是virtual function通过pointer或reference来实现的。
虚函数用virtual 修饰的function。主要用于实现ploymorphic。
纯虚函数用virtual funtion() = 0; 的函数。主要为了定义一个接口、规范。
public class A {
public:
virtual int add() {
return 5;
}
virtual void show() = 0;
}
如何在多态下调用父类的函数,去掉多态效果。需要将类型明确指定为父类实例,指针或引用不可,实际上这种应用会很少。
class Base {
public:
virtual void show() {
printf("base show.\n");
}
};
class Derived : public Base {
public:
void show() {
printf("derived show.\n");
}
};
int main() {
Base *base = new Derived();
base->show();
Base base1 =*base;
base1.show();
Base *base2 = base;
base2->show();
return 0;
}
//result
//derived show.
//base show.
//derived show.
- cast(转型)并不改变指针的大小,只是指出的内存空间的大小和内容变化。
- class 没有declared constructor, 编译器会为它生产一个implicit default constructor, 但是这个constructor 是trival,但是在下列4中情况下,constructor 是nontrival:
(1)member class object有default constructor。
(2)base class有default constructor。
(3)class有virtual functions。
(4)class有virtaul base class。
在constructor中有一个给vptr赋初值的操作。
constructor用于构建新对象时候需要调用的函数,该函数无返回类型。
public A {
public:
A(int a, int b);
A(int a, int b = 6);
}
default constructor没有提供显示初始化值,用来构建对象的函数,只能有一个。
public A {
public:
A(int a); //default constructor
}
virtual base class主要用于多重继承。例如:A,B inherit Base, c inherit A, B。
public A : public virtual Base {}
public B : public virtual Base {}
public C : public A, B {}
copy constructor : Default Memberwise Initialzation即按位逐次的copy member。
Base base;
Base base1(base);//调用copy constructor
Base base2 = base1; //调用copy constructor
Base base3; base3 = base1;//调用赋值操作符=类没有copy constructor时候,编译器会自动生成一个copy constructor,但是当类表现出BitWise Copy Semantics的时候,就不会生成copy constructor。下面4中情况不会体现BitWise Copy Semantics:
(1)class中的member class object声明有copy constructor。
(2)class继承的base class中声明有copy constructor。
(3)class中有一个或多个virtual funtion。
(4)class继承自一个继承链,继承链中有一个或多个virtual base class。c++的定义通常是指占用内存的行为。
参数初始化的伪代码
//代码 X xx; foo(xx); //伪代码 X _temp; _temp.X::X(xx); foo(_temp);
返回值初始化的伪代码
//代码 void foo() { X xx; return xx; } //伪代码 void foo(X &_result) { X xx; xx.X::X(); _result.X::X(xx); }
member initialzation list必须发生explict user-code前,必须使用member initialzation list的四种情况:
(1)初始化一个reference member
(2)初始化一个const member
(3)调用base class的constructor,它有一组参数
(4)调用member class object的constructor,它有一组参数