《深度探索c++对象模型》chapter1关于对象对象模型
在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual。已知下面这个class Point声明:
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;
};
这个class Point在机器中将会怎样被表现呢?也就是说,我们如何建模(modeling)出各种data member设function members呢?
1.简单对象模型(a simple object model)
简单对象模型:一个C++对象存储了所有指向成员的指针,而成员本身不存储在对象中。也 就是说不论数据成员还是成员函数,也不论这个是普通成员函数还是虚函数,它们都存储 在对象本身之外,同时对象保存指向它们的指针。

在这个模型中,member并不放在object中,只有”指向mmeber的指向“才放在object之内,这么做可以避免”members有不同的类型,因而需要不同的存储空间“所招致的问题。object中member是以slot的索引值来寻址,本例中_x的索引值是6,—point_count是7.一个class object的大小很容易计算出来,”指针代销,乘以class中所声明的members数目“便是。
2.表格驱动对象模型(a table-driver object model)
为了对所有class的所有object都有一致的表达方式,另一种对象模型是把所有与members相关的信息抽出来,放在一个data member table和一个member function table之中。class object本身含义指向这2个表格的指针。member function table是一系列的slots,每个slot支持一个member function,data member table则直接含有data本身。

3.c++对象模型(the c++ object model)。

如下图:class ojbect含有一个vptr,指向vtbl,vtbl第一个一般是type_info object。

这个模型主要优点是在于它的空间和存取时间的效率,主要缺点是:如果应用程序代码本身未曾改变,但所用到的class object的non
static data member有所修改(可能增删改)。那么那些应用程序代码同样得重新编译。关于这一点,前面的双表格模型提供了较大的弹性,因为他多提供了一层间接性,不过它也因此付出空间和执行效率两方面的代价就是了。
下图给出VS2010中class Point的内存布局:

.png)
加上继承
单一继承、多重继承:
虚继承:
一个类的对象的内存大小包括:
- 所有非静态数据成员的大小。nonstatic data member
- 由内存对齐而填补的内存大小。(任何由于alignment的需求而填补padding上去的空间,可能存在于members之间,也可能存在于集合体边界)
- 为了支持virtual有内部产生的额外负担。(overhead)
class ZooAnimal {
public:
ZooAnimal();
virtual ~ZooAnimal();
virtual void rotate();
protected:
int loc;
String name;
};
在32位计算机上所占内存为16字节:int四字节,String8字节(一个表示长度的整形,一个 指向字符串的指针),以及一个指向虚函数表的指针vptr。对于继承类则为基类的内存大小 加上本身数据成员的大小。在cfront中其内存布局如下图:

指针的类型
指针的大小都是4字节,表示一个地址。指针的类型并不影响指针的大小,只是用来告诉编译器如何解释这个地址开始的一块内存内容及其大小。
C++中语法上的多态要用指针或者引用。一个指针(pointer)或者引用(reference)之所以支持多态,是因为他们并不引发内存中任何“与类型有关的内存委托操作(type-dependent commitment)”。会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。
更多:陈浩:http://blog.csdn.net/haoel/article/details/3081385
《深度探索c++对象模型》chapter1关于对象对象模型的更多相关文章
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 拾遗与填坑《深度探索C++对象模型》3.2节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
- 柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
随机推荐
- CentOS 6.7安装Tomcat 7
1.下载Tomcat 7 wget http://apache.fayea.com/tomcat/tomcat-7/v7.0.67/bin/apache-tomcat-7.0.67.tar.gz 2. ...
- 3DES加解密【示例】
代码 /** * 3DES加解密 */ public class DESedeUtils { private static final String ALGORITHM_MD5 = &qu ...
- node安装 教程 + git初步
我的系统是win8.1 64位 这个是对应的安装包:http://files.cnblogs.com/files/zxyun/node-v0.12.5-x64.zip 安装中有不懂可以参考下面的两 ...
- Java-struts2 配置hellow world
这里进行struts框架的配置问题,和简单的输出hellow world 配置的步骤 1. 配置TomCat 2. Jak 3. 拷贝struts.xml文件到src目录 ...
- CI框架篇之模型篇--初识(1)
模型 模型是专门用来和数据库打交道的PHP类.例如,假设你想用CodeIgniter来做一个Blog. 你可以写一个模型类,里面包含插入.更新.删除Blog数据的方法. 下面的例子将向你展示一个普通的 ...
- mvc5 + ef6 + autofac搭建项目(三)
前面已经基本完成了框架的搭建,后面就是实现了,后面主要说下前端的东西bootstrap的使用和相关插件. 看图: 实现比较简单,在主页面只引入共用部分的 js等相关包,毕竟不是所有页面都需要列表以及其 ...
- SQL性能优化没有那么神秘
经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一 ...
- Angularjs总结(三)摸态框的使用
静态页面: <input class="btn btnStyle " value="提 取" type="button" ng-cli ...
- window远程连接linux
一.字符界面连接Linux 1.直接使用window自带的telnet. 2.但现在Linux一般都不启用telnet,而是启用ssh.这样的话,window就要安装客户端来访问Linux了.这 ...
- 利用c++操作XML,主要是内部循环方法的使用
本文主要分享的是循环方法的使用,设置XML节点属性,用了3种循环方法. XML文件: <?xml version='1.0' encoding='utf-8' ?><root> ...