内存模型

<深入探索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,它有一组参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值