C++对象模型初窥

最近写miniC的编译器在,就顺带着看了 C++编译相关的操作。 虽然没有深入到C++编译器的内部实现,但是对C++的对象模型还是做了一个大致的了解。


参考资料:http://blog.csdn.net/outmanlee/article/details/6396621

参考书籍: inside the c++ object  model

C++ 和 C 的基础部分语法都是类似。 C++在C的基础上增加了 封装,继承,多态这些C++的特性。

封装很好说

继承和多态一起如下:

首先说下C++的整体对象模型:

1. 类的非静态数据成员会每个对象一份。

2. 类的非静态函数成员会在编译阶段拿到类外面成为一个单独的函数(会给函数加上一个类对象的参数)。当然名字会变化一下,具体的变化算法不知。

3. 类的静态函数成员和静态数据成员都是类拥有的,不是类对象特有的,所以只能通过类名访问。

4. 虚函数是实现多态的必要条件之一,C++在这个基础上实现的比较巧妙, 每个含有虚函数(或者先辈含有虚函数)的类都具有一个虚表,同时类的数据成员

  中会隐式添加一个指针成员指向这个虚表,这个虚表作用就是用来运行时查找到底运行哪个对象的函数的。


可以看第一个链接看具体的分析过程, 下面主要说需要注意的点:

1. 多写程序进行测试, 数据成员是按声明次序在类中进行分布的, 同时要注意到对齐:

  class A{

  public:

     int x;

     char y;

     int z;

  };

      A a;

访问x可以: 1. &a 得到了对象地址,其实也是成员x的首地址

      2. (int*)&a  将这个地址转换为了一个int型指针。

      3. *( (int*)&a ) 解引用就将2中地址后的四个字节当成整数来解析

  y注意要进行对齐, 同时要注意指针类型进行加减时 是根据 指针类型对应的字节 来改变值的。

2.  编译器在编译时会做很多的内部改变,隐藏了很多细节。

  比如:

    1. 类内部函数会移到外面去。同时名字会变换

    2. 处理多态的时候。

        parent  *p =  new child();

        p -> 多态方法()

      实际上会转换成

        ((*P) .vtbl[x])(*p)

     具体看第一个链接。

    

      

原文地址:https://www.cnblogs.com/hpf311/p/2722173.html