Inside the C++ Object Model 深度探索对象模型 1-Object, 2-Constructor

C++二级模拟题深度解析:从指针、类到文件操作的核心考点与避坑指南 C++作为一门核心的系统编程语言,其基础语法和内存管理机制是理解计算机底层原理的关键。从概念上讲,指针和引用是C++中直接操作内存地址的工具,理解它们对于掌握程序运行时的数据存储与访问至关重要。在原理层面,指针存储变量地址,而引用则是变量的别名,二者在初始化、可空性和可变性上存在本质区别。其技术价值在于,精准的内存控制能带来极高的运行效率,是开发操作系统、游戏引擎等高性能系统的基石。应用场景广泛,从嵌入式设备驱动到大型服务器后端都离不开对内存的精细管理。本文通过一份经典的计算机二级C++模拟题,深入剖析了指 阅读详情

前言摘录 >BarbaraMoo常说 管理一个团队 就像放牧一群骄傲的猫.

1 关于对象Object

>参数化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class type, int dim>          
class Point          
{          
public:          
    Point(type coords[dim])           
    {          
        for (int index = 0; index < dim; index++)          
                mCoords[index] = coords[index];          
    };          
    type& operator[](int index)           
    {          
        assert(index < dim && index >= 0);          
        return mCoords[index];          
    }                  
private:          
    type mCoords[];          
};

加上封装后的布局成本 Layout costs for adding Encapsulation

>C++在布局和存储时间上主要的额外负担是由Virtual引起 
-virtual function机制 支持一个有效率的"执行期绑定" runtime binding; -virtual base class 实现"多次出现在继承体系中的base class, 有一个单一而被共享的实体" [棱形结构] -一些多重继承下的额外负担

1.1 C++对象模式

>class data: static/nonstatic; class member functions: static/nonstatic/virtual;

简单对象模型

>一个class的大小, 指针大小乘以class中所声明的members的数目;

表格驱动对象模型

>Member Data Table+Member Function Table

C++对象模型

1)class产生一堆指向virtual functions的指针 放在virtual table里面; 
2) vptr 每一个class object被添加了一个指针 指向相关的vtable, vptr的设定和重置都由每一个class的constructor和destructor,copy assignment运算符完成; 每个class关联的type_info object(RTTI)由vtable指出.

加上继承 Inheritance
>单一继承 多重继承 虚拟/共享继承 -虚拟继承的情况下 base class不管被派生多少次, 只会存在一个实体subobject.

对象模型如何影响程序

>不同的对象模型会导致'现有代码修改', '加入新的程序代码'

1.2 关键词差异 keyword distinction

关键词的困扰

>class-struct ADT(abstract data type)

策略性正确的struct

>C struct在C++中的合理用途, 当你要传递一个复杂的class object的全部或者部分到某个C函数中去时, struct可以将数据封装起来, 保证拥有与C兼容的空间布局. 这项保证只在组合composition的情况下才存在, 对于继承, 编译器会决定是否应该有额外的data members被安插到base struct subobject中.

1.3 对象的差异

>C++直接支持3种程序设计典范 programming paradigms

1) 程序模型 procedural model 2) 抽象数据模型 abstract data type ADT model 3) 面向对象模型 object oriented model

>只有通过point和reference的间接处理才支持OO设计的多态性质.

>C++支持多态的方法

1)隐含的转化操作, 把derived class指针转化为指向public base type的指针 Ex. shape* ps = new circle();

2)virtual function机制 3) dynamic_cast和typeid

>一个class object的内存 -nonstatic data members总和; -应alignment的需求填补边界padding; -支持virtual由内部产生的额外负担 overhead;

指针的类型

>指针的内存大小是固定的, 与指向的数据类型无关;

1) 指向地址1000的整数指针 在32bit机器上 地址空间1000~1003, 4byte/一个word空间; 2) 如果String是8byte, 一个4byte的字符指针和一个表示字符串长度的int. 3) ZooAnimal指针为 1000~1015(int+string+vptr 4+8+4)

1
2
3
4
5
6
7
8
9
10
class ZooAnimal      
{      
public:      
    ZooAnimal();      
    virtual ~ZooAnimal();      
    virtual void rotate();      
protected:      
    int loc;      
    string name;      
};

加上多态

Ex. Bear b; ZooAnimal* pz = &b; Bear* pb = &b; // ((Bear*)pz)->BearMember(); pb->BearMember(); [dynamic_cast]

Ex. Bear b; ZooAnimal za = b; //切割 sliced

>当一个base class object被直接初始化为一个derived class object时, derived class object会被切割, 塞入较小的base type 内存中; 没有多态出现;

---Section1 End---

2 构造函数语意学 The Semantics of Constructors

2.1 Default Constructor的构建操作

>default constructor在需要的时候被编译器产生出来; 4种情况

带有Default Constructor的Member Class Object

>一个class没有constructor, 但它内含一个member obejct, 后者有default constructor, 那这个class的implicit default constructor是nontrivial, 编译器需要为class合成一个default constructor.

带有Default Constructor的Base Class

>一个没有constructor的class派生自一个带有default constructor的base class, 则这个derived class的default constructor会被视为nontrivial.

带有一个Virtual Function的Class

1) class声明/继承一个virtual function; 2) class派生自一个继承串链, 其中有virtual base classes.

>编译期间的扩张操作 1) virtual function table(vtbl)会被编译器产生出来, 内置class的virtual function地址. 2)在每个class object中, 额外的pointer member(vptr)会被编译器合成出来, 内含相关class vtbl地址.

带有一个Virtual Base Class的Class

>棱形继承/虚拟继承;  在derived class object的每一个virtual base class中安插一个指针; 经由reference或pointer来存取一个virtual base class的操作都可以通过相关指针完成.

总结 在合成的default constructor中只有base class subobjects和member class object会被初始化, 其他的nonstatic data member Ex. 整数 整数指针 整数数组等不会被初始化.

2.2 Copy Constructor的构建操作

>3种情况, .  Ex. class X {...}; X x;

1) 明确以以一个object的内容作为另一个class object的初值: X x2 = x; 2) 当object作为参数: foo(x2);  3) 当函数传回一个class object: X foo_2() { return x2;}

>拷贝构造函数的第一个参数类型是class type, 第二参数以及后继参数需要有默认值;

Default Memberwise Initialization

>DMI把每一个内建的或派生的data member(指针,数组,etc)的值, 从某个object拷贝一份到另一个object, 不会拷贝其中的member class object, 而是以递归的方式施行memberwise initializtion.(赋值初始化)

>default constrctor和copy constructor在必要的时候才由编译器产生出来 (当class不展现bitwise copy semantics时)

>一个class object可以从两种方式复制得到, 1)被初始化-copy constructor 2)被指定 assignment -copy assignment operator.

Bitwise Copy Semantics位逐次拷贝 - 不要Bitwise Copy Semantics

一个class不展现bitwise copy semantic的情况:

1) 当class内含member object, 后者的class声明有一个copy constructor时(不论是设计者明确声明或者编译器合成的);

2)当class继承自一个base class, 后者存在有一个copy constructor时.

3)当class声明了一个或多个virtual functions时.

4)当class派生自一个继承串链, 其中有一个或多个virtual base classes时.

>前2种情况, 编译器必须将member或base class 的copy constructor调用操作安插到被合成的copy constructor中.

重新设定Virtual Table的指针

>编译期间的2个程序扩张操作 -增加一个vtbl, 内含每一个有作用的virtual function的地址; -将一个指向vtbl的指针vptr安插在每一个class object内;

>当编译器导入一个vptr到class中时, 该class就不再展现bitwise semantics了;

处理Virtual Base Class Subobject

>一个class object如果以另一个object作为初值, 而后者有一个virtual base class subobject, 会使bitwise copy semantics失效;

2.3 程序转化语意学 Program Transformation Semantics

明确的初始化操作 Explicit Initialization

>程序转换2个阶段 1)重写每个定义(占用内存的行为), 初始化操作被剥除; 2) 安插class的copy constructor操作;

X x1(x0); -->编译器安插X copy constructor的操作 X x1; x1.X::X(x0);

参数的初始化 Argument Initialization

>把一个class object当作参数传给一个函数(或作为函数的返回值), 相当于 X xx = arg; 的操作;

Ex. void foo(X x0); X xx; foo(xx); 编译器的操作--> X __temp0; __temp0.X::X(xx); foo(__temp0); //形参需要改变为reference; void foo(X& x0); 另一种实现方法是以拷贝建构copy construct的方式把实际参数直接建构在其所在位置上.(Borland C++)

返回值的初始化 Return Value Initilization

>双阶段转化 1)加上一个额外参数, 类型是class object的reference. 这个参数用来放置被拷贝构建copy constructed而得的返回值; 2)在return指令之前安插一个copy constructor调用操作, 将想要传回的object的内容当作上述新增参数的初值;

Ex. X bar() { X xx; return xx;} 编译器转换--> void bar(X& __result) { X xx; xx.X::X(); __result.X::X(xx); return;}

函数指针 X (*pf)(); pf=bar; --> void (*pf)(X&); pf=bar;

在使用者层面做优化 Optimization at the User Level

>定义一个计算用的constructor; Ex. X bar(const T& y, const T &z) { return X(y, z); } --> void bar (X& __result, const T& y, const T& z) { __result.X::X(y, z); return; }

在编译器层面做优化 Optimization at the Compiler Level

>编译器优化操作 Named Return Value(NRV)优化;

>批评1)优化由编译器完成, 实现程度外部不可知; 2)函数变得比较复杂时, 优化难以施行; 3)程序员在某些情况下不希望应用程序优化;

Ex. X xx0(1024); --> xx0.X::X(1024); //单一的constructor操作; Ex. X xx1 = X(1024); X __temp; __temp.X::X(1024), xx1.X::X(__temp); __temp.X::~X(); //调用两个constructor, 对于临时object调用destructor;

Copy Constructor 要还是不要

>default copy constructor被视为trivial, bitwise copy不会导致memory leak和address aliasing, 快速安全;

>memcpy()或memset()都只有在classes不含任何由编译器产生的内部members时才能有效运行.

摘要 copy constructor的应用 会使编译器多少对程序代码做部分转化, 当函数以传值方式传回class object, 而该class有copy constructor(明确定义或者合成出来的), 会导致程序转化--在函数的定义或使用上; 编译器也将copy constructor的调用操作优化, 以一个额外的第一参数取代NRV.

2.4 成员们的初始化队伍 Member Initialization List

>必须使用member initialization list的情况

1)初始化一个reference member; 2)初始化一个const member; 3)调用一个base class的constructor, 而它拥有一组参数时; 4) 调用一个member class的constructor, 而它拥有一组参数时;

>member initialization list提高效率, 避免编译器内部扩张constructor; Ex.

1
2
3
4
5
6
7
8
9
class Word{   
public:   
    Word(){   
        mName = 0;   
        mCnt = 0; }   
private:   
    string mName;   
    int mCnt;   
};

扩张-->Word::Word() { mName.string::string(); string temp = string(0); mName.string::operator=(temp); temp.string::~string(); mCnt = 0; }

>提高效率的办法 Word::Word() : mName(0) { mCnt = 0;  }  扩张--> Word::Word() { mName.string::string(0); mCnt = 0; } //调用了string(0)的constructor;

Notice: >list中的初始化顺序是由class中的members的声明次序决定的, 不是initialization list的排列次序决定的. >Initialization list的操作被放在explicit user code之前;

>编译器会对initialization list处理并可能重新排序, 会安插一些代码到constructor内, 放置于explicit user code之前.

---Section2 End---


深度探索C++对象模型_中英 深度探索C++对象模型_中英 深度探索C++对象模型_中英 深度探索C++对象模型_中英 立即下载

相关推荐

深度探索C++对象模型(中&&英文版)

inside c++ object Model && JJ.Hou中译本 《深度探索C++对象模型》

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

之前一直对C++内部的原理的完全空白,然后找到《Inside The C++ Object Model》这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研读,由于该书的内容给人比较散的感觉,所以一直想找个时间整理一下,遂成此文,虽然都是抄书上的,但是却让我有了温故而知新的觉悟,附近里有三个好资料,一并共享了!2012年9月2日凌晨 4:31 谢谢 张雨生的歌声...

qiudesuo的专栏 526

深入C++对象模型(英文版)

英文名: Inside the C++ Object Model中文名: 深度探索 C++ 模型作者: Stanley B. Lippman出版社: Addison Wesley出版时间:1996-5-3总页数: 304 作者 Stanley B. Lippman 是最早从事 C++ 编译器编写的人员之一。这本书主要面向中高级 C++ 程序员,不过初级 C++ 程序员下点功夫应该也能看懂。这本书阐述了 C++ 具体是怎么实现的,也澄清了许多人对 C++ 的误解。学习这本书,有助于编写出更加高效的 C++ 程序。如果你想知道 C++ 到底是怎么实现的,想写出更高效的 C++ 程序,这本书绝对不容错过!以下书评转自电驴:http://www.v91v.com/ed-info/41/10693.html======================================== 从编译器的角度观察C++可以使你知其然并知其所以然.本书探讨了大量的C++面向对象程序设计的底层运作机制,包括构造函数,函数,临时对象,继承,虚拟,模板的实例化,异常处理,运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷.喜欢刨根问底的C++程序员可以从中了解了无数的编译器解释源代码的细节,以及记忆体分配的细节.

深度探索 C++对象模型:Inside the C++ Object Model

书中首先介绍了C++对象模型的基本概念,包括对象的内存布局、类的成员变量和成员函数的存储方式等。C++对象模型的核心是如何在内存中表示对象,以及如何通过指针和引用来操作这些对象。C++ 对象模型是理解 C++ 编程语言如何在内存中表示和管理对象的基础。它涉及对象的内存布局、类的成员变量和成员函数的存储方式,以及如何通过指针和引用来操作这些对象。普通成员函数是与类的实例相关联的函数。它们可以访问类的非静态数据成员和其他成员函数。value = v;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1082

深度探索C++对象模型(中文版&英文版)

经典书籍,从编译器的角度观察C++可以使你知其然并知其所以然.本书探讨了大量的C++面向对象程序设计的底层运作机制,包括构造函数,函数,临时对象,继承,虚拟,模板的实例化,异常处理,运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷.喜欢刨根问底的C++程序员可以从中了解了无数的编译器解释源代码的细节,以及记忆体分配的细节.. 资源包含中英两版!

深度探索C++对象模型(中英文版)

深度探索C++对象模型(中英文版) 中文:候捷译 英文:Stanley B. Lippman

CPU 缓存 | 原理、映射、一致性

……

u013669912的博客 410

Inside the C++ Object Model.pdf

自己根据CHM版本转化的,英文完整文字版本包含书签目录和封面,网络上都包含trial version字样,所有重新做了一个更好的版本。

Inside the C++ Object Model电子书pdf下载

Inside the C++ Object Model电子书pdf下载链接: https://pan.baidu.com/s/1GikiBCkv4MVoC19NRDTw1A 提取码获取方式:关注下面微信公众号,回复关键字:1176

欢迎关注微信公众号:DroidMind 3142

【mip-NeRF】使用一组二维图像渲染3D场景视频(mip-NeRF论文复现)

本文对mip-NeRF模型的pytorch实现进行了复现

Ryan2k的博客 1848

ComfyUI实战:AnimateDiff与ControlNet结合,打造无缝风格化视频转绘

本文详细介绍了如何利用ComfyUI平台,结合AnimateDiff与ControlNet插件,实现高质量的视频风格化转绘。通过搭建节点工作流、调整关键参数,有效解决画面闪烁与失真问题,并分享了进阶玩法与常见问题解决方案,帮助用户轻松打造流畅、风格统一的动态视觉效果。

weixin_29039773的博客 339

许多电子编程书籍网址,转载点点的

发现一个“新浪微盘”,空间大,下载方便,也没有广告。以后我会陆续把我的所有开发资料移到“新浪微盘”中,免费分享给大家。 (1) 有“新浪微博”的可以直接拷贝资料到你自己的新浪微盘(我的新浪微盘 ); (2) 没有“新浪微博”的,也很方便,也是可以直接下载或者在线浏览,速度也很快。     "C++Primer+中文第四版(pdf高清完整版).pdf" http://t.cn/zWznXX

晴天的专栏 1207

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1305

深入探索C++对象模型中的英文词意

      在看COM本质论的前言时,作者Dox Box说了这么一句话:“理解编程模型最可靠的方法是抓住COM的基本词汇表,并精通这些词汇的语义。而这恐怕只能通过编写COM程序并分析这些程序为什么能够按预定的方式工作才能够获得”。这些对于初学者,是任重而道远的,首先应该做的是把英文专用名词给摘录下来,并试着从其对应中文名字理解,所以在这边博文中摘录了《深入探索C++对象模型》这本书中的英文专用名词

COM 568

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5333

柑橘病虫害识别方案总结

1. 方案一 1.1 赛题背景 1.2 数据分析 1.3 模型设计 1.3.1 模型具体方案 1.3.2 模型设计 1.4 实验结果 1.5 总结与展望 2. 方案二 2.1 赛题介绍 2.2 数据分析 2.3 算法方案解析 2.3.1 检测模型 2.3.2 提升策略 2.4 优化思路 3. 方案三 3.1 数据分析 3.1.1 数据说明 3.2 技术展示 3.2.1 数据输入端 3.2.2 模型结构端 3.2.3 上下文信息 3.2.4 训练优化端 3.2.5 创新性分析 3.3 算法及系统思考.....

herosunly的博客 2万+

[深度探索C++对象模型] most-derived class

Third, if a class inherits one or more classes that have virtual parents, themostderived class is responsible for constructing the virtual base class. In this case, Copier inherits Printer and Scann...

Lord_sh的博客 774

YOLOv8进阶:SEAM注意力与Repulsion Loss双剑合璧,突破遮挡检测瓶颈

做目标检测时,最头疼的莫过于目标被遮挡的场景——行人被树木挡住一半、车辆被广告牌遮挡部分轮廓……这些情况往往让模型“犯迷糊”。但现在,有了SEAM注意力模块和Repulsion Loss排斥损失,我们就能让YOLOv8在遮挡场景下也能“拨开迷雾见真章”。这篇教程会带你一步步理解这两个技术,并亲手把它们融入YOLOv8,让你的检测模型在复杂场景下也能稳如泰山。

FJN110的博客 233

深度探索C++对象模型电子书pdf下载

深度探索C++对象模型下载链接: https://pan.baidu.com/s/1UEI9YBSsCnnOyC91-VomWg 提取码获取方式:关注下面微信公众号,回复关键字:1163

欢迎关注微信公众号:DroidMind 5969

喷涂机器人系列编程:ABB IRB 5500_(9).常见故障诊断与排除

ABB IRB 5500 喷涂机器人在实际应用中可能会遇到各种故障,但通过系统的诊断和排除方法,可以确保生产线的连续运行。定期维护和保养是预防故障的重要手段,而操作培训和规范则能有效减少人为因素引起的故障。希望本节内容能帮助操作和维护人员提高故障诊断和排除的效率,确保喷涂机器人的稳定运行。如果您有任何疑问或需要进一步的帮助,请联系 ABB 客户服务中心。

zhubeibei168的博客 1045

保险还在等灾后报案?高精度气象开始提前计算“赔付风险”

【摘要】传统保险理赔模式正在向灾前风险管理转型,保险公司竞争焦点从"赔得快"转向"预判准"。文章提出构建气象保险风险指数(WRI),通过"气象危险度×资产暴露度×标的脆弱性"精准计算损失风险,实现从天气预报向"损失天气"的转变。核心观点包括:1)需关注气象要素的强度、持续时间和空间位置三维度;2)可视化系统应直接显示预期赔付热力图;3)需解决指数保险的基差风险问题,采用多源数据融合技术;4)理想平台需包含风险地图、损失热力图、灾

专注AI大模型,软件混淆,授权 54

C++对象模型简介(一)——《深度探索C++对象模型》精简笔记

壹 单一继承且无虚函数的对象模型 class A { public: int foo( ) { return val ; } static int staFun( ) { return staVal ; } static int staVal ; private: int val ; char bit1 ;

菜鸟的自留地-mooyang 5988

假人有限元模型

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

上一篇: Head First 设计模式 Design Pattern 附录 Mediator Memeto Prototype Visitor
下一篇: Inside the C++ Object Model 深度探索对象模型 3-DATA 4-Function
罗伊yc
博客等级 码龄22年 23粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值