zoukankan      html  css  js  c++  java
  • 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)

         具体看第一个链接。

        

          

  • 相关阅读:
    AngularJS 包含HTML文件
    AngularJS 验证
    AngularJS html+DOM+ng-click事件
    表格边框css
    Ubantu下面命令听歌(豆瓣fm)
    AngularJS $http
    AngularJS过滤器
    Python-注册
    Python之内置函数
    生成手机号码代码
  • 原文地址:https://www.cnblogs.com/hpf311/p/2722173.html
Copyright © 2011-2022 走看看