c++对象模型是什么,对象的内存布局和结构问题
在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定。C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接触的就是c++对象。在上个世纪一共有三种c++对象模型,它们的出现可以说是一个不断优化的过程最终只有我们目前看到的c++对象模型在使用。了解c++对象模型非常重要,了解之后对于对象的内存布局,内存大小,虚函数以及静态数据成员和成员函数的理解有非常巨大的帮助。言归正传,下面就来分别讨论c++的三种对象模型(本来只应该讨论目前有的,但是不和原来的被废弃的对比又怎么能体现出目前c++对象的优秀呢)。下面的对象模型都以该类为基础进行说明

15.1最简单的对象模型
只有slot索引简单来说就是利用一个索引槽来完成,每一个对象obj都拥有众多的slot槽,这些索引槽分别指向类的数据成员和成员函数,虽然时间存取效率高了但是却赔上了巨大的内存开销,在那个内存很昂贵的时代是不能容忍的,就像下面的图。

15.2表格驱动对象模型
稍微好一点的对象模型将数据和成员函数分开,在这个对象模型中将类的数据成员和成员函数分置在两个不同的table中,一个叫做datamember table另一个叫做function table对象本身只有指向这两个表的指针,就像下面图中的一样。虽然这个模型没有被使用但是function table却为后面的虚函数内存布局提供了参考。

15.3 c++对象模型
现在就要来说说我们目前的c++对象模型了,现在的对象模型相对比较复杂整个结构分成了五个区域,数据成员区域,vPtr虚表驱动指针区域,非static function member区域,static member区域,static function member区域。值得注意的是只有数据成员以及vPtr虚表驱动指针才存放到对象模型的内存结构中去,就像下图一样。

看到这个模型就能解释为什么static数据成员和成员函数是属于类的而不属于某个对象,因为他们在整个类中只有一份实例。对象里面不会存在他们。此外也能解释为什么类中不管有多少个虚函数永远都只丢给它4字节的内存大小,因为虚函数再多指向虚表的驱动指针只有一个。这只是两个比较典型的例子,除此之外还有很多可以解释的问题,比如神奇的1byte问题等等。
c++对象模型是什么,对象的内存布局和结构问题的更多相关文章
- VS中C++对象的内存布局
本文主要简述一下在Visual Studio中C++对象的内存布局,这里没有什么测试代码,只是以图文的形式来描述一下内存分布,关于测试的代码以及C++对象模型的其他内容大家可以参考一下陈皓先生的几篇博 ...
- C++ 对象的内存布局(上)
C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击这里查看下篇>>> 前言 07年12月,我写了一篇<C++虚函数表解析>的文 ...
- C++ 对象的内存布局(上)
本文转载自haoel博主的博客:陈皓专栏 [空谷幽兰,心如皓月] 原文地址:C++ 对象的内存布局(上) C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击 ...
- (转)C++对象的内存布局
原文地址:http://blog.csdn.net/haoel/article/details/3081328 C++ 对象的内存布局 陈皓 http://blog.csdn.net/haoel 前言 ...
- HotSpot源码分析之C++对象的内存布局
HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型.为了更好理解这个模型, ...
- JVM——深入分析对象的内存布局
概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的.Class本身就是一个对象,都以KB为单位,如果new Integer()为了表示一个数据就占用KB级别的内 ...
- Java对象的内存布局
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...
- jvm学习记录-对象的创建、对象的内存布局、对象的访问定位
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...
- Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...
随机推荐
- python-redis-pipe文件
redis导入数据比较头疼的事情,涉及几千万,导入还是很耗时,通过生成pipe文件的方式比较快捷. python3.6.1版本 在linux环境下运行 with open("data1&qu ...
- DS05--查找
一.学习总结 1.查找的思维导图 2.查找学习体会 2.1 关联容器和顺序容器 c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.其中vector表示 ...
- (转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法
本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jd ...
- java代码=====实现修改while()
总结: package com.mmm; public class cse { public static void main(String[] args) { // int count=0;你妹,我 ...
- [Java.Web] Servlet 的一些细节
本文来自 传智播客视频PPT 1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet 程序映射到一个 URL 地址上,这个工 ...
- limesurvey的问卷类型
- Docker for windows 7 - 加载 docker images
背景 由于之前一直是在 Linux 上面跑,所以对于docker for windows 部分不是很熟. 由于我们的合作伙伴需要在windows 上面跑我们的docker image, 所以在自己的w ...
- 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案
我在使用SpringMVC的@RequestBody和@ResponseBody注解处理JSON数据的时候,总是出现415的错误,说是不支持所提交数据格式,我在页面中使用了JQuery的AJAX来发出 ...
- CDH5.10 添加kafka服务
简介: CDH的parcel包中是没有kafka的,kafka被剥离了出来,需要从新下载parcel包安装.或者在线安装,但是在线安装都很慢,这里使用下载parcel包离线安装的方式. PS:kafk ...
- 36种漂亮的CSS3网页按钮Button样式
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...