深度探索C++对象模型第一章第一节重点

《深度探索C++对象模型》笔记 第一章 1.多态:不同对象去完成同一行为时,可以展现出不同的形态。在运行时,可以通过指向基类的指针或引用,来调用实现派生类中的方法。 作用:在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即类型需要修改或增加功能时,只需改动或增加较少的代码,提高开发效率。 2.C++对象模型 所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非静态)都置于对象之外。另外,用一张虚函数表(virtual table)存储所有指向虚函数的指针,并在表头附加上一个该类的type_info对象, 阅读详情

C++的额外成本

C++较之C的最大区别,无疑在于面向对象。类相较于C的struct不仅只包含了数据,同时还 包括了对于数据的操作。在语言层面上C++带来了很多面向对象的新特性,类、继承、多态 等等。新特性使得C++更加强大,但同时却伴随着空间布局和存取时间的额外成本。作为一 个以效率为目标的语言,C++对于面向对象的实现,其实不大,这些额外成本主要由 virtual引起,包括:

  • virtual function 机制,用来支持“执行期绑定”。
  • virtual base class ——虚基类机制,以实现共享虚基类的 subobject。

除此之外C++没有太多理由比C迟缓。



三种对象模型

C++类包含两种数据成员:静态数据成员和非静态数据成员;同时包含成员函数,静态函数 和虚函数三种成员函数,这些机制在C++对象是如何被表现的?下面有三种模型可以用以表 现它们——简单对象模型、表格驱动对象模型以及C++对象模型。也许你没兴趣去了解有几种 方式可以实现C++的对象模型,只想了解C++对象模型。然则,C++对象模型是在前两种对象 模型上发展而来的,甚至于局部上直接用到前两种对象模型。

假定有一个Point类,我们将用三种对象模型来表现它。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;  
};

简单对象模型

简单对象模型:一个C++对象存储了所有指向成员的指针,而成员本身不存储在对象中。也 就是说不论数据成员还是成员函数,也不论这个是普通成员函数还是虚函数,它们都存储 在对象本身之外,同时对象保存指向它们的指针。

简单对象模型

简单对象模型对于编译器来说虽然极尽简单,但同时付出的代价是空间和执行期的效率.显而 易见的是对于每一个成员都要额外搭上一个指针大小的空间以及对于每成员的操作都增加了 一个间接层。因此C++并没有采用这样一种对象模型,但是被用到了C++中“指向成员的指针” 的概念当中。

表格驱动对象模型

表格对象模型

表格驱动模型则更绝,它将对象中所有的成员都抽离出来在外建表,而对象本身只存储指向 这个表的指针。右图可以看到,它将所有的数据成员抽离出来建成数据成员表,将所有的函 数抽取出来建成一张函数成员表,而对象本身只保持一个指向数据成员表的指针。

侯大大认为,在对象与成员函数表中间应当加一个虚箭头,他认为这是Lippman的疏漏之处, 应当在对象中保存指向函数成员表的指针。

然而我在这儿还是保留原书(而非译本)的截图,因为以我之拙见,不保存指向成员函数表 的指针也没有妨碍。因为形如float Point::x()的成员函数实际上相当于float x(Point*) 类型的普通函数,因此保存指向成员函数表的指针当属多此一举。

当然C++也没有采用这一种对象模型,但C++却以此模型作为支持虚函数的方案。

C++对象模型

所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非 静态)都置于对象之外。另外,用一张虚函数表(virtual table)存储所有指向虚函数的指 针,并在表头附加上一个该类的type_info对象,在对象中则保存一个指向虚函数表的指 针。如下图:

C++的对象模型



关于最后一个程序,这里虚函数采用的是索引号的形式 

这里正好解释我之前的一个疑问:http://blog.youkuaiyun.com/hellowos/article/details/11854671





第一章:深度探索C++对象模型 1:在C语言中,数据和处理数据的操作(函数)是分开声明的。C语言本身没有支持“函数与数据”之间的关联性。这种程序方法叫做程序性,算法函数处理的是外部的数据。 2:在C++中,我们使用ADT(抽象数据类型abstract data type)来实现函数与数据的封装。 3:C++的这种做法不一定比C语言更好,因为有额外的时间成本与空间成本在内,如书中所说:“C的吸引力在于其精简与简易”。 4:C++在... 阅读详情

相关推荐

深度探索C++对象模型笔记

一、关于对象C 语言是程序性的,语言本身并没有支持数据和函数之间的关联性C++ 中可能采取抽象数据类型,或者是多层次的类结构完成C++ 的封装并没有增加多少成本,每一个成员函数虽然在cla...

编程与实战的博客 1811

深度探索C++对象模型

深度探索C++对象模型(1)第一章:关于对象(Object Lessons)读完这一章使我想到了一个很久以前看到的一个笑话,编写一个HELLO WORLD的程序,随着水平和职务的不一样,程序代码也随着变化。当初看时完全当作笑话来看,现在看来写此笑话的人水平不一般。如果要使你的代码能够最大限度的适应不同的运行环境,和最大限度的复用,则在设计和编写的过程中需要考虑的问题很多,因此代码已变的不在具有

daneric的专栏 2443

制作Ubuntu22.04启动盘

现在越来越多程序代码都需要运行在linux环境下,运行这些代码的前提是安装一个稳定的linux操作系统。本文选择Ubuntu 22.04去制作系统启动盘。本文主要对ubuntu22.04的启动盘制作过程进行了详细的说明,希望能帮助到有需要的朋友。

lyx_ok的博客 1万+

《深度探索C++对象模型》重点章节摘录

1.首先介绍一下几种对象模型,也就是对象在内存中的存在形式 简单对象模型(A Simple Object Model) 在Object中不存储任何直接的data member 或 function member, object中存储的都是指针,这个指针指向members。 这就是简单对象模型,对于此模型,可以避免诸如“不同的数据类型,需要不同的的存储空间”这一类的问题。 表格驱动对象模型(A Table-driven Object Model) 在object中,只存在两个指针,一个指向memb

Garen的博客 339

Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包

一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】     http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2  百度云网盘  提取码:z...

向来如此,就一定是对的吗 6万+

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈)

本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。

weixin_29209805的博客 215

《深度探索C++对象模型》读书笔记-第一章

第一章 关于对象 一.C++对象模型(The C++ Object Model) 在C++中,有两种class data members(数据成员):static(静态数据)和nonstatic(普通非静态数据),以及三种class member function(成员函数):static(静态成员函数),nonstatic(非静态成员函数)和virtual(虚函数)。如下例子: class Point{ public: Point(float xval); virtual ~Point(); /

Estelle 343

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2957

《深度探索C++对象模型》勘误表

《深度探索C++对象模型》(侯捷译),英文原版书名为《Inside the C++ Object Model》,Stanley B.Lippman著。光看作者和译者的名字,就知道这本书非同反响。的确,无论是这本书的原版还是译作,都被读者给予了很高的评价。我,作为一名C++的爱好者,当然是怀着一份无比景仰的心情,仔细阅读完了全书。现在将书中我觉得需要勘误的地方摘出来,与大家共享。1.第五章“构造

mlite的专栏 2251

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

【K210+STM32项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(更新3.0版本)(完整工程资料源码)

STM32F407STM32F407_2(含有app功能)

嵌入式技术开发 2489

深度探索C++对象模型(2012版本)

深度探索C++对象模型(2012版本) 【下载地址】深度探索C对象模型2012版本 深度探索C++对象模型(2012版本)欢迎来到《深度探索C++对象模型》(2012年版)的Git仓库页面 项目地址: https://gitcod...

gitblog_09768的博客 402

多物理场光学仿真软件:Lumerical_(15).多物理场耦合仿真案例分析

在多物理场光学仿真中,Lumerical 软件提供了强大的工具来模拟复杂的光学系统,包括光子学、热学、力学和电学等多物理场的耦合。本节将通过具体的案例分析,展示如何在 Lumerical 中进行多物理场耦合仿真的开发和实现。我们将从简单的热光效应仿真入手,逐步深入到更复杂的多物理场耦合场景,如光电效应和光力学效应。每个案例都将包括详细的原理说明和具体的代码示例,帮助读者更好地理解和应用这些技术。

kkchenjj的博客 1022

《深度探索C++对象模型》

文章目录第六章 执行期语意学第七章 站在对象模型的尖端 第六章 执行期语意学 第七章 站在对象模型的尖端

strdhgthbbh的博客 601

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2917

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度解读《深度探索C++对象模型》之C++虚继承的实现分析和效率评测(一)

C++对象在经过类的封装后,存取对象中的数据成员的效率是否相比C语言的结构体访问效率要低下?本篇将从C++编译器的角度出发,来分析虚继承的实现,以及它们的存取效率如何?

iShare_Carlos的博客 1235

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《深度探索C++对象模型》阅读笔记 第一章 关于对象

C++类包含两种数据成员:静态数据成员和非静态数据成员;同时包含成员函数,静态函数和虚函数三种成员函数 在此模型中,被配置于每一个 之内,则被存放在所有的 之外. 和 也被放在所有的 之外. 则由虚表机制实现,class 里保存着一个指向虚表的指针,虚表中存放着指向虚函数的函数指针。 每一个class所关联的type_info object(用以支持 runtime type identification,RTTI)也经由 virtual table 被指出来,通常是放在表格的第一个slot处。这个模

哇咔咔的博客 524

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《深度探索C++对象模型》阅读笔记(零)——引子

C++本不是门易学的语言,入门如此,进阶更甚,而当我从一个写C++程序之人,转变成调试大型C++工程之人的时候,我深切的感受到了C++的晦涩难懂。 当我面对一个个bug的时候,我是那么迷茫: 明明已经是个空指针了,为何程序会崩溃在指针指向的函数之中,而不是调用之时? 明明是已经被删除的指针,怎么还能对内存访问得那样自如? 明明也是个空指针,但这次为何在函数调用之时就崩溃了? 再加上找不到

飞奔在原野 935

深度探索C++对象模型(2)

zzy5177的专栏 292

深度探索C++对象模型(2)

 笔记贴出后,有朋友便给我提出了一个很好的建议,原文如下:史列因:我刚看了你写的“深度探索C++对象模型(1)”,感觉很不错。不过我有一个建议:你说“谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生”是很自然的。第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了。第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了。这本书中很多内容都是前后重复的。我建议你先不管看懂看不懂,

Dan_Cooper的专栏 587

《深度探索C++对象模型》阅读笔记(一)——对象的内存布局1

本章是从整个对象的全局观来审视C++,并对比C++和C,讨论出一个较为高效和简明的C++对象模型,最后详细介绍了继承如何对程序造成影响。 主要分为以下几个内容: 引入。C++如何基于C构建对象C++简单对象的内存布局模型讨论Class 和 Struct 间的关系和影响详细讨论对象的继承 关于C++的强大以及C的简洁之间的讨论已经很多,因而我不打算介绍C++是如何基于C构建对象的。而是

飞奔在原野 1389

《深度探索C++对象模型》笔记(三)构造函数、拷贝构造和初始化列表

看了这一章后发现:原来最难搞懂的是拷贝构造函数。 2.1默认构造函数.         C++标准是这么说的:对于class X,如果没有任何user-decleared-constructor,那么会有一个default constructor被暗中(implicitly)声明出来。。。。一个被暗中声明出来的default constructor将是一个trival(无用的) const

郭晓东的专栏 3025

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

世界上第一款c++编译器cfront由Lippman开发的,而本书的作者正是他。 现用C++对象模型 在c++中,有两种类数据成员:static 和 nonstatic;三种类函数成员:static、nonstatic、virtual。 函数都放到代码区,而static成员都放到静态区,因此 c++对象的大小由 nonstatic类数据成员、内存填充和virtual指针决定,其中virtual指针来源于: virtual function:用以实现动态多态,支持一个有效率的 "执行期绑定" vi

youaremyalllove的博客 1876

《深度探索C++对象模型》第一章:关于对象

C++对象模型的设计 : nonstatic的data members被放置于每一个class之内,static的data members则被放置于class之外,static和nonstatic的function被放置于class之外。virtual function以下面两个步骤支持: 每个class产生一个virtual table(vtbl),里面存放指向每个virtual functi...

weixin_34087503的博客 137
上一篇: mixin风格的bases class
下一篇: 关于深度探索C++对象模型笔记
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值