C++对象内存模型---数据封装

半世苍凉 提交于 2019-12-02 08:17:21

“C++是C的超集”,这句话里包含了两个问题:

1. C++兼容C;

2. C++在C之上进行了扩展;

那C++在C之上进行了哪些扩展呢?众所周知,C++内置了众多编程机制、支持众多编程风格:面向过程、基于对象、面向对象、面向、基于模板、泛型、元编程等等。其中,以面向过程、基于对象、面向对象的编程机制最为流行。

大家都知道,面向对象有三个基本特征:数据封装与抽象、继承、多态。下面通过分析C++对象内存模型,来剖析C++面向对象的这三个基本特征。

讲到C++的数据封装和抽象,就不得不提类的成员函数和成员数据:

成员数据 非静态对象、静态对象
成员函数 非静态函数、静态函数、虚函数

下面,直接上测试代码,直观的看看C++的基本对象内存模型。

class A{};                             //size: 1
class B{                               //size: 1
    static int mem;
    static void print();
};

class C{                               //size: 4
    int mem;
    void print();
};
class D{                               //size: 8
    char mem;
    static int s_mem;
    virtual void print1(){};
    virtual void print2(){};
};
class E{                               //size: 4
    virtual void print1() = 0;
    virtual void print2() = 0;
};

从测试结果来看,

1. 空类的Size为1,应为编译器自动添加了一个标记字节。(Size为0就太诡异了!)

2. 静态数据和静态函数,配置到对象之外。

3. 非静态函数,配置到对象之外。

4. 含有虚函数的对象,配置有一个指向类虚拟表(vtbl)的指针。

5. 纯虚对象(接口对象),配置有一个指向类虚拟表的指针。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!