1.类的成员

  • 数据成员
    . Static
    . Nonstatic
  • 成员函数
    . Static
    . Nonstatic
    . virtual

Questions:

C++封装带来的布局成本是多大?
由空类组成的继承层次中,每个类对象的大小是多大?(答案见此篇)

2.虚函数表

  1. 含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表vptr
  2. 每一个类为每一个virtual函数产生一个指针,放在表格中,这个表格就是虚函数表。每一个类对象会 被安插一个指针(vptr),指向该类的虚函数表。
  3. vptr的设定和重置都由每一个类的构造函数、析构函数和复制赋值运算符自动完成。

3.对象模型

// An highlighted block
var foo = 'bar';class Point
{
public:    Point( float xval ); virtual ~Point();      float x() const;  static int PointCount();
protected:  virtual ostream&  print( ostream &os ) const;float _x;  static int _point_count;
};

简单对象模型
表格驱动对象模型

c++对象模型

附注:
RTTIRun Time Type Identification)运行时类型识别

  • 编译器生成的特殊类型信息
  • 包括对象继承关系,对象本身的描述
  • 为多态而生成的信息,所以只有具有虚函数的对象在会生成

三种对象模型比较

定义 优点 缺点
简单对象模型 对象由一系列的指针组成,每一个指针都指向一个数据成员或成员函数,也即是说,每个数据成员和成员函数在类中所占的大小是相同的 实现简单 空间;执行期的效率
表格驱动对象模型 一个指针指向数据成员表,一个指向函数表 如果应用程序代码未曾改变,但所用的class objects的nonstatic data members有所修改,那么那些应用程序是否需要重新编译有一定弹性,因为提供了一层间接性 空间;执行期的效率
C++对象模型 静态数据成员,静态成员函数和一般非静态成员函数(包括构造函数)均存放在class object之外(单独存取,和对象无关),而非静态数据成员则被放在每一个class object内,虚函数则由虚表支持 空间;执行期的效率 如果应用程序代码未曾改变,但所用的class objects的nonstatic data members有所修改,那么那些应用程序均得重新编译

[2] 是对类的头文件改变时,需要重新编译的说明:

  • add a data member

This changes the size of instances of the class. Might be Ok for anyone who just uses pointers or references, if you take care to put that data behind all other data, so that the offsets for accessing the other data members do not change. But the exact layout of sub objects in binary is not defined, so you will have to rely on a specific implementation.

【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2] C++ — When recompilation is required https://stackoverflow.com/questions/4033487/c-when-recompilation-is-required

深度探索C++ 对象模型(1)-三种对象模型的设计相关推荐

  1. 深度学习未来发展的三种学习范式:混合学习,成分学习和简化学习

    深度学习是一个很大的领域,其核心是一个神经网络的算法,神经网络的尺寸由数百万甚至数十亿个不断改变的参数决定.似乎每隔几天就有大量的新方法提出. 然而,一般来说,现在的深度学习算法可以分为三个基础的学习 ...

  2. 深度相机---(4)三种方案对比

    原文:http://blog.csdn.net/app_12062011/article/details/52511701 RGBD方案对比: 关键技术规格: 1.检测范围: 2.检测精度: 3.检测 ...

  3. 深度好文:接入交换机三种架构TOR、EOR 和 MOR:有什么区别?

    大家好,这里是网络技术联盟站,我是瑞哥. 众所周知,数据中心服务器机房的布局通常采用矩形结构,为了保证散热效果,通常将10到20个机柜背靠背.并排排列成一对机柜组(也称为POD),为满足海量服务器连接 ...

  4. FPGA:三种基本门电路设计(与门、或门、非门)

    FPGA的设计跟数电是紧密相连的,而我们学习数电时候,学习的第一个内容就是数字逻辑基础,这里面就包含了我们今天要讲解的三种基本的门电路. 这里,我们依次讲解过来: 1.与门 定义:有两个或多个输入,但 ...

  5. 玩转MYSQL(2) 数据库的约束、聚合查询、联合查询以及三种表的设计

    目录标题 一.MYSQL的那些约束你掌握了几种? 二.表与表之间的三种关系 三.查询 3.1 :聚合查询 3.2.GROUP BY 3.3.HAVING和group by 搭配使用 3.4.联合查询 ...

  6. 深入C++对象模型(1) -- C++的三种模型

    从本篇博客开始,根据<深入C++对象模型>这本书,加上自己的理解,探讨C++的对象模型以及相关的问题.博客尽量使用书中的名词.图例和例程. 一.什么是对象模型 语言中直接支持面向对象程序设 ...

  7. 三种主流深度相机介绍

    随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用 3D 相机进行物体识别,行为识别,场景 建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D) ...

  8. 计算机模拟多孔碳,多孔碳材料分子设计的三种方法

    原标题:多孔碳材料分子设计的三种方法 多孔固体分子设计在过去二十年里中取得了巨大的成功.得益于其独特的性质,多孔碳材料(尤其是活性碳 )由于其独特的性质已可作为分离介质持续使用.这篇发表于Elsevi ...

  9. 汇佳学校家长专栏|家校携手,共创“教育的第三种选择”

    随着疫情的延续,以及国际局势的变化,学生出国留学所需要面临的不确定性和风险正在增加.在此背景下,教育作为关乎每个家庭的重要命题,更是令众多家长犹豫不决,陷入选择国内升学或出国留学两难选择的困境中. 部 ...

最新文章

  1. [原][osg][gdal]两种方式修改tiff高程
  2. python界面长什么样子-图形界面
  3. linux rm 删除所有文件,linux无需rm就可快速删除大量文件
  4. 使用 Mesos 管理虚拟机
  5. mybatis学习(38):动态sql-foreach
  6. web处理高并发措施
  7. lock字段mysql_MySQL的lock tables和unlock tables的用法(转载)
  8. android q桌面,Android Q带来全新桌面模式
  9. 经历过贫穷,才知道做穷人意味着什么
  10. MapTask工作机制图解
  11. 你真的需要那么多报表么?| 专栏
  12. AD15使用出现的小问题
  13. Django 清空数据库的所有表
  14. 谈谈单片机编程思想——状态机
  15. 企鹅医生与杏仁医生签订战略合并协议,全面发力大健康领域
  16. PDF怎么在线免费转换成WORD,亲测可用
  17. 【论文笔记_目标检测_2022】Cross Domain Object Detection by Target-Perceived Dual Branch Distillation
  18. 高并发 WEB 服务器 nginx 源码通读中文分析注释,带详细函数注释及函数调用注释,附 github 地址,后期持续维护更新...
  19. 英语话题 Festival
  20. Leetcode 594. 最长和谐子序列

热门文章

  1. 电子计算机工程学,计算机工程
  2. php 数组交集函数,PHP array_intersect_uassoc 函数
  3. 事物运动的状态和方式是谁提出的_金属材料在电磁场中的行为方式及其与光电效应的关系分析...
  4. python str转dict_在python中将str转换为dict
  5. 高压细水雾灭火技术在数据中心机房中的消防应用
  6. 未来的数据中心(二)
  7. java swing鼠标事件监听_java swing鼠标监听问题
  8. ML:MLOps系列讲解之《基于ML的软件的三个层次之02 Model: Machine Learning Pipelines——2.5 Different forms of ML workfl》解读
  9. 成功解决ImportError: cannot import name ‘Imputer‘
  10. HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!