深度搜索C++对象模型 - 关于对象

基恩士PLC编程避坑指南:局部变量@前缀的3个隐藏陷阱与实战解决方案 本文深入剖析了基恩士PLC编程中使用@前缀创建局部变量的三大隐藏陷阱,包括在线调试时的数据丢失、数据类型冲突以及子程序复用时的地址覆盖问题。针对每个陷阱,提供了预定义变量、强类型规范和基址参数传递等实战解决方案,帮助中高级工程师提升代码健壮性与可维护性。 阅读详情


深度搜索C++对象模型:

关于对象:
在C语言中 数据 和 处理数据的操作(函数) 是分开来声明的 也就是说 语言本身并没有支持"数据和函数"之间的关联性;
我们把这种程序方法成为 程序性的; 有一组"分布在各个以功能为导向的函数中"的算法所驱动, 他们处理的是共同的外部数据;

而C++则会考虑使用一种独立的 抽象数据类型 ADT 来实现一些数据和函数的关联性; ( 其实就是class )

类对于函数和数据来说 加上了封装; 对于加上封装必然会带来一些布局成本;
但是对于C++来说 布局以及存取时间上的主要的额外负担是 virtual 引起的 ( 包括 virtual function 机制, virtual base class 机制 )


C++对象模式:
C++有两种 class data members :     static 和 nostatic
C++有三种 class member function : static 和 nostatic 和 virtual

例如:

而对于class Point在机器内存中会表现成什么样 ?

class Point
{
	public:
		static int m_Num;			// static data member;
		int m_Age;				// nostatic data member;
		static void Func1();			// static member function;
		void Func2();				// nostatic member function;
		virtual Func3();			// virtual member function;
};

-->  简单对象模型 :
这个模型中 一个 class object 是一系列的slots 每一个slot指向一个members; ( 可能是data member 也可能是 member function )

-->  表格驱动的对象模型 :
这个模型中 所有与member相关的信息被分类并抽取出来 放到一个 data member table 和一个 member function table 中;
class object 本身则是指向这两个表格的指针; data member table 内涵data数据; 而 member function table中是一系列的slot 指向了member function;
-->  C++对象模型 :
此模型中 class object 中配置了 nostatic data member; 然后还配置了一根指向 virtual table 的指针;
对于 static data member, nostatic member function, static member function 则被配置到了 class object 之外;


 C++程序设计范式 :
-->  程序模型 :
类似于C语言的 顺序化的程序设计思路;
-->  抽象数据类型模型( ADT )  :
类似于C++提供的 string 类;
-->  面向对象模型( OO ) :
此模型中有一些彼此相关的类型, 通过一个抽象的base class 封装起来 ( 其实就是class设计 );

虽然我们可以间接或直接的处理集成体系中的一个 base class object, 但是只有通过 pointer 或 reference 的间接处理
才支持OO程序设计所需的多态性质;
在OO设计范式中, 我们需要处理一个未知实例, 他的类型虽然有所界定,却有无穷可能;
这组类型受制于其继承的体系, 这个体系没有深度和广度的限制;
原则上, 被指定的object的真是类型在每一个特定执行点执行之前, 是无法解析的,
在C++中, 只有通过 pointer 和 reference 的操作才能够完成, ( 通过pointer来指代无法预知的类型 );
而在ADT范式中 所有的实例都是固定而且单一的, 他在编译的时候已经完全定义好了;

虽然 对于object的多台操作 要求此object必须可以经由一个pointer或者reference来存取,
但pointer或reference的处理却不是多态处理的必然结果;
( 对于一个 int * 类型的指针 他就没有多态的处理 )
结论: C++中 多态只存在于一个个的public class 体系中( 必须是 public 继承 );


C++提供三种方式支持多态:
-->  有一组隐式的转化操作 :
shape *ps = new circle();
-->  经由 virtual function 机制 :
ps->rotate();
-->  经由 dynamic_cast 和 typeid 运算符 :
if( circle *pc = dynamic_cast< circle * >( ps ) )...

多态的主要用途是经由一个共同的接口来影响类型的封装, 这个接口通常被定义在一个抽象的base class中;
这个共享接口是以 virtual function 机制引发的,他可以在执行期间根据object的真正类型解析出到底是哪一个函数实例被调用;

 一个类需要多少内存大小
--> 其 nonstatic data members 的总和大小
--> 加上任何由于内存对其要求填补的内存空间
--> 加上为了支持virtual function机制而在内部产生的额外负担( 一般是一根vptr )

 指针的类型
ZooAnimal *px;
int *pi;
Array< String > *pta;
以上三根指针有何不同?
从内存需求的观点来说  没什么不同 ,
他们三个都需要足够的空间来放置一个机器地址( 通常是一个dword, 4字节 );
 指向不同类型的指针 之间的差异, 即不再其指针表示法不同,也不再其内容( 一个地址 )不同 ;
而是在于 其所寻址出来的object类型不同 ,也就是说 指针类型会教导编译器如何解释特定地址中的内存及其大小 ;
( 例如 一个int *p;指针, 他将会覆盖4字节的内存地址 假设p内容为( 1000H ), 那么他将会覆盖 1000H - 1003H )
( 那么 如果是一根 double *p 指针, 他自然会覆盖8字节的内存地址, 因为他是double类型的指针 )
( 但是对于两根指针本身来说 他们没有任何区别 都是一个双字 里面存的是4字节的地址 )
那么来解释一下: ( ZooAnimal是父类 Bear是子类 )
Bear *be = new Bear();
ZooAnimal *za = be;
他们有何区别:
就这两根指针来说 他们没有任何区别, 如果你这么写 za == be; 那么他会是真
为什么 因为这个值比较的是两根指针的内容 根据我们上面所说 他俩都指向了同一个new Bear(); ( 堆地址 );
指向了同一个东西 所以他们的内容  也就是new Bear()的地址  完全相同 所以上面的判断会返回真;
但是他俩又是不一样的, 因为 be是Bear类型的指针, 但是an是ZooAnimal类型的指针
be指针是Bear类型 他会教导编译器按照Bear的内存模型解释 ( 父类内存模型 + 子类内存模型 )
an指针是ZooAnimal类型 他会教导编译器按照ZooAnimal的内存模型解释( 只有父类内存模型 )
所以他们的表现是不相同的,,, 虽然be == an;
za = be; 这句话唯一影响到的只有 za指向内存的大小和内容解释方式 而已
be = za; 这样则不允许, 因为这样做会 溢出他所配置得到的内存 ;
C++通过class的pointer和reference来支持多态, 这种程序设计风格就是 面向对象 ;


Android系统开发工程师面试指南与参考答案 本文整理了Android系统开发工程师面试常见问题与参考答案。核心内容涵盖:1)Framework层定制方法,如修改HAL和系统服务;2)ANR问题分析工具(systrace)与解决方案;3)性能优化实践,包括开机加速和功耗管理;4)四大组件工作机制与应用案例;5)Native崩溃调试技巧。文章强调通过AOSP源码研究、工具使用和项目案例准备来提升面试表现,重点考察应聘者的系统开发深度和实操能力。参考答案均基于实际开发经验,提供可量化的优化成果说明。 阅读详情

相关推荐

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

深度探索C++ 对象模型

深度探索C++ 对象模型 第二章 对象 第二章第一节 类对象所占用的空间 成员函数不占用类对象的内存空间一个类对象至少占用1个字节的内存空间成员变量是占用对象的内存空间成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象; 第二章第二节 对象结构的发

weixin_42252757的博客 1173

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1248

C++对象模型详解

C++对象模型详解 原文链接:吴秦大神的C++对象模型。 何为C++对象模型? C++对象模型可以概括为以下2部分: 1、语言中直接支持面向对象程序设计的部分; 2、对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,如构造函数、析...

dichuangheng8094的博客 605

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南)

本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。

weixin_26800111的博客 457

国家大地2000坐标系投影坐标转高德地图经纬度坐标-【高斯投影坐标】

国家大地2000坐标系投影坐标转换成高德经纬度坐标显示画图。

devil_zhuzhu的博客 1万+

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

https://www.cnblogs.com/wickedpriest/p/6527181.html https://www.cnblogs.com/wickedpriest/p/6580134.html 前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++、操作系统、计算机网络、算法和数据结构等。C++就先从这本《深度探索C++对象模型》开始。不同于...

$firecat利白的代码足迹$ 919

Fat-Tree Topo Architecture(胖树拓扑结构)

背景 最近在搜索关于Fat-Tree的相关资料时,发现网上内容比较少,很多博客是相互转载的,拓扑结构图也加载不出来,使得对Fat-Tree的理解过于抽象。 实践 传统数据中心采用多层级的树形结构,这种结构针对客户端/服务器(C/S)模式能有较好的效果。树形结构包括单根树和多根树。多根数的根节点往往作为备份节点存在(我们以方格代表交换机)。 传统单根/多根拓扑结构有以下缺点:成本高,根部交换机必须要有足够大的带宽来满足下层服务器之间的通信;性能瓶颈,无法满足数据中心内部大规模的MapReduce和数据拷贝。

金色牛神的专栏 3万+

深度探索C++对象模型

c++对象模型语言中直接支持面向对象程序设计的部分对于各种支持的底层实现机制说白了是介绍编译器是如何支持、实现C++的面向对象机制的。如,继承、虚函数、指向class members的指针等等,编译器是如何实现的。本书C++语法基于C++95本书出版自2001年,虽然书中用到的标准早已盖棺定论,cfront编译器也早已过时,当时来看一些无法确定的标准、难以实现的技术、功能也早已实现,但是对C++对象模型的某些实现方式依然沿用至今。这本书依然不过时。

surfaceyan的博客 1825

PINN驱动的3D不可压缩流场重建——从稀疏2D2C观测到完整物理场反演——含源码实现

多尺度融合策略在此发挥作用:高分辨率的2D2C数据用于约束平面内的精细结构,而低分辨率的3D3C数据提供第三维度的粗尺度信息。迁移学习架构在此发挥关键作用。这种策略在湍流封闭模型构建中尤为有效,其中RANS提供的平均流场与DNS的雷诺应力数据融合,显著提升了分离流的预测精度。在稀疏数据场景下,注意力权重根据观测数据的分布动态调整,强化数据缺失区域的物理约束,同时避免过拟合于观测点。这种机制与自适应采样的结合,实现了计算效率与重建精度的平衡,在仅保留约百分之十关键节点的情况下,仍能保持高物理一致性。

u012133341的博客 136

3D Slicer学习记录(4)-PLUSapp连接双目相机Intel Realsense

plusapp是基于openIGTLink协议的免费的开源库和应用程序API接口,用于数据采集、预处理、校准和实时流成像、位置跟踪和其他传感器数据。这里以intel realsense双目相机为例详细的演示整个图像流导入到3D Slicer的流程。

weixin_39090239的博客 1346

c++_learning-对象模型探索

深入介绍了c++类对象的内存布局,以及虚函数的引入对内存布局分布的影响。c++因虚函数的引入,产生的动态多态的性质分析。函数模板、类模板的分析。

qq_44599368的博客 1627

AutoSAR系列讲解(入门篇)2.1-AppL概述

该章主要是讲解SWC是如何在ECU中分布的

雪云飞星的博客 4万+

深度搜索C++对象模型1-关于对象

刚开始看深度搜索C++对象模型这本书,

春秋战车 953

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

1.通过vtbl,调用class的成员函数.(操作平台:mac 64位系统) #include #include #include using namespace std; // template // void GetAddr(ToType &addr, FromType f) // { //     union //     { //         From

noticmp的专栏 599

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度搜索C++对象模型(理念总结)

1. 目标: C++的语法规格(C++ 标准)如何具体实现出来的, 即编译器如何理解并构建一系列的数据结构, 去扩充/优化/翻译cpp源代码,然后组成串行指令,确保最终代码能够准确而高效执行. 大致包括1). 编译器功能的思考和设计逻辑                         2).cpp源代码的编译+链接(不用生成汇编)的步骤. 2.构造函数语义学: 遵循语意(C++ 标准

noticmp的专栏 769

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度搜索C++对象模型 - 构造函数

 深度搜索C++对象模型: 构造函数 Default Constructor 构造函数: C++ARM告诉我们: Default Constructor在需要的时候被编译器产生出来. 关键字: 在需要的时候 --> 被谁需要 需要来干什么? 例子: class Foo {  public:   int m_val;   Foo *next; }; void FooBa

github_21089181的专栏 494

深度搜索C++对象模型 - 构造语义学

 深度搜索C++对象模型:  构造,拷贝,析构语义学 //*********************************************************************************************// ---> "构造函数语义学": class A {     public:     virtual ~A() = 0;     v

github_21089181的专栏 473

深度搜索C++对象模型 - 复制构造函数

 深度搜索C++对象模型: 复制构造函数 由构造函数篇可以猜到, 复制构造函数其实也"不一定"会被编译器产生.. 提到复制,自然是类成员之间的复制, 有三种情况 会把一个 class object 的内容作为另一个 class object 的初值: --> 对一个 class object 做显示的初始化操作: class A { }; A a; A b = a; --> 对

github_21089181的专栏 360

深度搜索C++对象模型 - 数据语义学

 深度搜索C++对象模型: Data Semantics //*********************************************************************************************// ---> "虚拟继承的 sizeof 问题": class X { }; class A : virtual public X {

github_21089181的专栏 454

深度搜索C++对象模型 - 函数语义学

 深度搜索C++对象模型:  Function Semantics C++支持三种类型的 member function: static nonstatic virtual; 后文分析他们的差异 //*********************************************************************************************//

github_21089181的专栏 543

深度搜索C++对象模型 Data 语意学-数据存取

关于sizof():C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。

春秋战车 917

深度搜索C++对象模型 Function 语意学-虚拟成员函数

1 这一节主要讨论虚函数,以及关于

春秋战车 901

通过对象指针的方式强行指定到子类_c++对象模型

使用c++有些年头了,有一本深度搜索c++对象模型的书写的很赞,很经典。本文是本书的读书笔记。关于对象加上封装后的布局成本c语言中如下声明一个结构体typedef struct point3d{ float x; float y; float z;}Point3d;struct point3d 转化为class Point3d之后class Point3d{ public: Point3d(flo...

weixin_39517289的博客 94

深度搜索C++对象模型2.2 构造函数语义学-Copy Constructor的构造操作

Shallow Copy = Bitwise Copy,Deep Copy = Memberwise Copy.

春秋战车 1066

深度搜索C++对象模型2.2 构造函数语义学-Default Constructor的构造操作

implicit 暗中的 explicit 显式的 trivial 没用的 no

春秋战车 965
下一篇: 深度搜索C++对象模型 - 构造函数
zhang_yao_wu1993
博客等级 码龄12年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值