现用C++对象模型

在c++中,有两种类数据成员:static 和 nonstatic;三种类函数成员:static、nonstatic、virtual。

函数都放到代码区,而static成员都放到静态区,因此

c++对象的大小由 nonstatic类数据成员、内存填充和virtual指针决定,其中virtual指针来源于:

  1. virtual function:用以实现动态多态,支持一个有效率的 "执行期绑定"
  2. virtual base class:用以解决多重继承中的内存问题

c++对象模型如下:

注意:

  1. 虚函数表的第一个slot并不是类虚函数地址,而是类的类型信息(用以支持RTTI)。
  2. vptr的初始化由编译器在construct中初始化
  3. vptr的放置顺序C++ standard并未做出规定,但一般放在对象的头部或者尾部(最常见的是放头部);对象中的数据成员按照其申明顺序放置。

编译器程序转换

px->foo();  // 假如foo()是虚函数// 编译器转换后px->_vtbl[2];   // 虚函数表其实就是个指针数组

对象模型为:

指针类型

指针类型本质

以上三个指针,本身没啥区别,都是占据4字节(32位机器)的地址值,其类型主要体现在其 所指object类型上,指针类型会教导编译器如何解释某个特定地址中"内容及空间大小"

给出ZooAnimal的类声明:

pza指针类型为 ZooAnimal,就可以知道其所指对象的大小为(4+8+4),内容如下:

而void* 指针,只能得到一个空间的起始地址,而空间大小和空间内容都不得而知,所以无法操作object。空间大小和内容是和类型绑定的,所以在进行cast类型转换时,其实就是在对象空间起始地址不变的情况下,更改其内容和大小。

指针类型在本书后面的讲解中,是十分重要的一个概念。

指针类型和多态的关系

定义一个Bear类继承ZooAnimal类

其可能的内存布局如下:

可以看出,指针的值相同,但由于类型不同,其所指的子类对象涵盖的空间比父类对象更大。

因此,不能让一个子类类型的指针指向一个父类对象,不然就会非法访问到超出父类对象的空间,引起安全问题。

但父类类型的指针指向子类对象是常见的(多态)

另外,下面这种写法也是可行的,会将子类的空间切割复制到父类空间中:

深度探索C++对象模型(一):关于对象相关推荐

  1. 深度探索C++ 对象模型(2)-类的对象的内存大小_2

    继续上文,看看继承类的大小 1. Bear类 类对象的大小为24: 16+8 class Bear : public ZooAnimal { public:Bear() {};~Bear() {}; ...

  2. 深度探索C++ 对象模型(2)-类的对象的内存大小

    1. Question: 32bit机器 1个指向地址1000的指针的大小是多少? 指针类型 涵盖地址空间 整数指针 1000~1003(32bit整数是4-bytes) void*指针 不确定 2. ...

  3. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  4. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

  5. 深度探索C++ 对象模型(5)-Initialization list(2)

    Initialization list的作用是效率 如下代码可以编译并运行,但是效率低下 class Word {String _name;int _cnt;public:Word() { _name ...

  6. 深度探索C++ 对象模型(5)-Initialization list(1)

    以下四种情况,一定要使用成员初始化列表: 1.初始化一个引用成员 2.初始化一个const成员 示例代码为 class Shape{const int m_size; //const 常量int &a ...

  7. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

  8. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

    1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...

  9. 深度探索C++ 对象模型(1)-三种对象模型的设计

    1.类的成员 数据成员 . Static . Nonstatic 成员函数 . Static . Nonstatic . virtual Questions: C++封装带来的布局成本是多大? 由空类 ...

  10. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

最新文章

  1. 性能压测诡异的Requests/second 响应刺尖问题
  2. 基于win32的windows画板程序
  3. mysql 存储过程复杂查询_SQL分页存储过程 支持连接查询等复杂的SQL
  4. eclipse下SVN subclipse插件
  5. 相册选取图片和照相机取图片
  6. STM32-TM1640-点数码管计数
  7. Qt界面程序的可视化设计
  8. PayPal付款状态解释-中英文对照
  9. 【精选】申请免费的服务器
  10. Allegro模块镜像详细操作教程
  11. 关于中文分词的一元分词讨论
  12. HiveSQL percentile和percentile_approx 函数计算千分数
  13. 基因数据处理12之samtool的tview来查看sam的匹配文件
  14. (一) windows 10 下安装 mongodb 并 globalsign/mgo 包的简单使用
  15. C9、E9、Z14、五院四系…这些高校联盟,光听名字就觉得很厉害!
  16. c语言设计计算器的意义,C语言结课设计之计算器功能
  17. Component series.line not exists. Load it first.
  18. 三极管 vs MOS管 | PMOS与NMOS
  19. c语言把char转化为string,浅析string 与char* char[]之间的转换
  20. 一周热图|比尔·盖茨在北京展示电子药盒;灯光艺术节点亮上海;陈飞宇、赖冠霖助力欧莱雅...

热门文章

  1. 心酸的两天(1):Nacos 启动后输入默认密码后:“用户名或密码错误”
  2. java 判断星期几_Java中如何判断某天是星期几
  3. iphone帧数测试软件,GFXBench 5.0推出全新测试 苹果A11也只跑17fps
  4. 电脑连接android手机测试,Android系统手机通过USB连接电脑上网
  5. littleVGL总结
  6. FPGA--IP核之FIFO
  7. python画代码流程图_python如何画流程图
  8. 为什么当函数值为定值时,梯度垂直于等值面?
  9. 团队项目(二)(江山代有才人秃队)
  10. 华为手机企业邮箱无法连接到服务器,华为手机邮箱无法登录