《深度探索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的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
随机推荐
- 卸载AMH 5.0面板的具体办法
安装AMH 5.0面板只有YES.NO和EXIT,和AMH 4.X的安装.卸载.退出有点不同,那么如何卸载AMH 5.0面板呢? 1.root登录ssh 2.输入如下命令: killall php-f ...
- linux根下目录详解及分区建议
/ 根目录 分区大小一定要充足,一般不小于5GB/bin,/usr/bin 普通用户使用命令 建议和/放一起/sbin,/usr/sbin 管理员使用命令/bin,/sbin 操作系统自身 ...
- 关于css的兼容
这篇随笔为了方便自己后期的学习和查找,用来记录平时遇到的一些问题,后期会陆续更新 1.背景图 :background-position属性,在ff下不支持该属性的拆分写法(background-pos ...
- Activity以singleTask模式启动,intent传值的解决办法
转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/46557827 因为项目中,有一个消息推送的功能,每次推送一个消息,就会开启F ...
- insert一句话实现插入一条数据并且返回这条数据的某列
insert into [table] output inserted.columnName values();
- LINQ 101——约束、投影、排序
什么是LINQ:LINQ 是一组 .NET Framework 扩展模块集合,内含语言集成查询.集合以及转换操作.它使用查询的本机语言语法来扩展 C# 和 Visual Basic,并提供利用这些功能 ...
- ES6-个人学习笔记一--let和const
es6已经推出一段时间了,虽然在兼容和应用上还有不少的难题,但是其提供的未来前端代码编程的发展趋势和一些好用的功能还是很吸引人的,因此个人买了'阮一峰'先生的es6入门,希望对其有一个了解和学习,本系 ...
- div模块变灰
整站变灰目前没发现什么特别好的办法,但是div(或者其他标签模块)模块变灰方法兼容性还不错. .gay_box{ filter: grayscale(100%); -webkit-filter: gr ...
- Win7 下,离线安装 Android Studio 1.0.1 的方法
此教程没有亲自动手试过,先保存在这里 http://download.csdn.net/detail/tuobaxiao2008/8268281
- WebApi学习总结系列第四篇(路由系统)
由于工作的原因,断断续续终于看完了<ASP.NET Web API 2 框架揭秘>第二章关于WebApi的路由系统的知识. 路由系统是请求消息进入Asp.net WebApi的第一道屏障, ...