zoukankan      html  css  js  c++  java
  • C++类继承内存布局(二)

    转自:http://blog.csdn.net/jiangyi711/article/details/4890889#

    (二 )成员变量

    前面介绍完了类布局,接下来考虑不同的继承方式下,访问成员变量的开销究竟如何

    没有继承:

    没有任何继承关系时,访问成员变量和C语言的情况完全一样:从指向对象的指针,考虑一定的偏移量即可

    单继承:

    由于派生类实例与其基类实例之间的偏移量为0,所以直接利用基类指针和基类成员之间的偏移量关系

    D* pd;
    pd->c1; // *(pd + dDC + dCc1); // *(pd + dDc1);
    pd->d1; // *(pd + dDd1);

    访问基类成员时,利用基类对派生类的偏移量和基类成员在基类中的偏移量计算

    访问派生类新增的成员时,直接计算派生类成员在派生类的偏移量即可

    多重继承:

    F* pf;
    pf->c1; // *(pf + dFC + dCc1); // *(pf + dFc1);
    pf->e1; // *(pf + dFE + dEe1); // *(pf + dFe1);
    pf->f1; // *(pf + dFf1);

    访问C类成员c1时,F对象与内嵌C对象的相对偏移为0,可以直接计算F和c1的偏移;

    访问E类成员e1时,F对象与内嵌E对象的相对偏移是一个常数,F和e1之间的偏移计算也可以被简化;

    访问F自己的成员f1时,直接计算偏移量

    虚继承:

    当类有虚基类时,访问非虚基类的成员仍然是计算固定偏移量的问题;访问虚基类的成员变量,开销将增大:

    1)获取虚基类表指针

    2)获取虚基类表中某一表项的内容

    3)把内容中指出的偏移量加到虚基类表指针的地址上

  • 相关阅读:
    08-蓝图&单元测试
    07-多对多操作
    JAVA 判断字符串是否可转化为JSONObject、JSONArray
    git常用命令
    线程和进程的一些基本概念
    JavaWeb学习总结(七):通过Servlet生成验证码及其应用 (BufferedImage类)
    JavaWeb学习总结(十):Session简单使用
    Ubuntu16.04 安装maven
    Ubuntu16.04 安装redis
    Ubuntu16.04 下安装tomcat
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4358593.html
Copyright © 2011-2022 走看看