深入探索C++对象模型->1.3对象的差异

一、C++程序设计直接支持三种程序设计模式(programming paradigms),程序模型、程序数据类型模型(OB)、面向对象模型(OO)

  1、程序模型:类似C语言,用过程型语句组成。

  2、抽象数据类型模型:所谓抽象就是讲实现和接口分离,显示提供接口,隐藏实现。(PS:不支持虚函数和多态)。

  3、面向对象模型:通过一个抽象的base class(用以提供共同的接口),将一系列有关联的类型封装起来。通过引用和指针来提供多态。

二、一个Class object共需要多少内存来表示呢?

  1、其nonstatic members的总和大小。

  2、加上任何由于alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界)

  3、加上为了支持virtual而由内部产生的任何额外负担。

三、指针与指针之间有什么不同呢?“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。

四、

/*
*ZooAnimal是基类,bear是派生类,rotate()是两者的虚函数
*/
Bear b;
ZooAnimal za = b;

za.rotate();

  这里存在两个问题:1、为什么rotate()调用的ZooAnimal::rotate()而不是Bear::rotate()?2、如果初始化函数将一个object内容拷贝到另一个object去,为什么za的vptr不指向Bear的vtbl?

对于第一个问题:直接通过对象调用并不支持多态,并且通过za里保存的virtual function机制调用,在编译期确定。

对于第二个问题:编译器保证一个对象里面vptr内容并不会因为assignment赋值、拷贝所改变。

时间: 2024-10-19 16:32:36

深入探索C++对象模型->1.3对象的差异的相关文章

深入探索c++对象模型->1.1c++对象模式

一.c++有三种c++对象模型: 1.简单对象模型:每个object是一系列的slots,每一个data member或function member(static.virtual.nonstatic)都有自己的一个slot. 2.表格驱动模型:每个object含有两个指针,这两个指针分别指向data member table和member function table.Member function table是一系列的slots,每一个slot指出一个member function: Dat

读《深度探索C++对象模型》之对象成员的效率

测试平台:华硕N53S(五年前的老机子) 编译环境:VS2010 接下来我将会有多个测试,在多个不同环境下的所消耗的时间比较: 五个测试分别为:个别的局部变量.局部数组.struct之的Public.class 之中的inline Get函数. class之中的inline Get & Set函数: 代码片段如下: struct Point { Point(float mx, float my, float mz) { x = mx; y = my; z = mz; } float x, y,

《深度探索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(o

【深度探索C++对象模型】第一章 关于对象

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

深度探索C++对象模型(一)——关于对象

引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作者Stanley Lippman总是会有意无意地从编译器的角度来介绍语言的细节:对新手而言,哪里会去关注这样底层的实现呢? 当读到<Inside The C++ Object Model>时,上述感觉愈发强烈,两书之间渐进讲述的细节让人读后大呼过瘾,也深感大师级作者笔触间的睿智. 众所周知,C++

深度探索C++对象模型的读书心得

参考:深度探索C++对象模型 (stanley B.Lippman著 侯捷翻译) 1. Page9 : C++对象模型,说明每一个类仅有一个虚函数表Vtbl,而类的每一个对象都有指向其表的指针. 2. Page30:引用也需要与一个指针(大小为4BYTE)相同的空间. 3. Page28: 指针类型会教导编译器如何解释某个特定地址中的内存内容及大小. 4. Page39: explicit关键字能够制止"单一参数的constructor被当做一个Conversion运算符" 5. Pa

[读书系列] 深度探索C++对象模型 初读

2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio之类的工具的话,写C++代码感觉要比较费劲,最近重读了这本书后,感觉要写点东西下来(因为懒得用笔作笔记,太慢了-_-!)加深下印象. 以前还是新手的时候,总是认为: 1.class如果没有定义任何constructor的话,编译器会自动合成一个default constructor(我习惯叫缺省的构造函数)出

深度探索C++对象模型第6章 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作. 全局对象 如果我们有以下程序片段: Matrix identity main() { //identity 必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity

【深度探索c++对象模型】Function语义学之虚函数

虚函数的一般实现模型:每一个class有一个virtual table,内含该class之中有作用的virtual function的地址,然后每个object有一个vptr,指向virtual table. 识别class是否支持多态,唯一恰当的方法是看它是否有virtual function,只要class拥有virtual function,它就需要额外的执行期信息. 考虑ptr->z(),ptr是基类指针,z是虚函数,为了找到并调用z()的适当实体,我们需要两项信息: 1.ptr所指对象