深入探讨C++对象模型 之 站在对象模型的尖端

ADS1220 STM32硬件SPI驱动程序 前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。 阅读详情

Template:

Template 的二个问题:

1.       template 的声明。当编译器看到一个template 声明时,编译器什么反应都没有。一切都不可用,只有通过template 的某个实体来存取或操作。

2.       template 的具现。

Point < float > fPoint;//产生一份实体与Point class 的float instantiation 在程序中产生关联。

Point < float > *ptr = 0;//程序什么也没有发生,因为一个指向class object 的指针,本身不是一个class object。不需要具现一个float 实体。

Point < float > &ref = 0;//会具现出一个“Point 的float 实体”,他的真正语意是:

Point < float > temporary ( float ( 0 ) );

Const Point < float > &ref = temporary;

因为reference 并不是无物的代名词。0被视为整数,必须被转换为类型为Point < float > 的一个对象。如果没有转换的可能,这个定义就是错误的,会在编译时被挑出来。

C++ Standard 让使用者来主导“具现”规则,有两个主要原因:

  1. 空间和时间效率的考虑。Member functions 的具现时间有使用者决定。
  2. 尚未实现的机能。有些用到的运算符可能一些具现的实体没有定义,由使用者来主导“具现”规则,template 就能够支持那些本来可能造成编译时期错误的类型。

Template 机制使类型检验被拖到“具现”操作发生时才进行,因而导致很多十分漏骨的错误声明都能通过编译。

Template 之中,对于一个nonmember name 的决议结果是根据这个name 的使用是否与“用以具现出该template 的参数类型”有关而决定的。如果其使用互不相关,那么就以“定义出template 的程序”来决定name。如果其使用互有关联,那么就以“具现出template 的程序”来决定name。

这意味着一个编译器必须保持两个scope contexts:scope of the template declaration;scope of the template instantiation.

Member Function 的具现行为:

Member functions 可能在编译时期或链接时期被具现出来。

编译器必须回答三个问题:

  1. 编译器如何找出函数的定义?

Ø         方法一:包含template program text file,就好象它是个header 文件一样。

Ø         方法二:要求一个文件命名规则:在.h文件中发现的函数声明,必须在.c 或.cpp中找到template program text。

  1. 编译器如何能够只具现出程序中用到的member functions?

Ø         方法一:把所有的member functions 都产生出来。

Ø         方法二:仿真链接操作,检测看看哪一个函数真正需要,然后只为它(们)产生实体。

  1. 编译器如何阻止 member definitions 在多个.o 文件中都被具现呢?

Ø         方法一:产生多个实体,然后从链接器中提供支持,只留下其中一个实体,其余都忽略。

Ø         方法二:由使用者来导引“仿真链接阶段”的具现策略,决定哪些实体才是所需求的。

   Template 机制的各种实现的弱点就是当实体第一次被产生出来时或是被非必要的再次具现或是“决定那些函数是否需要具现”所花的代价太大是,会大量增加编译时间,编译器的表现另人失望。

   C++语言规定:如果一个virtual function 被具现出来,其具现点紧跟在其class 的具现点之后。

   C++ Standard 已经扩充了对template 的支持,允许程序员明确地要求在一个文件中将整个class template 具现出来

Template class Point3d < float >;

或是针对一个template class 的个别member function:

template float Point3d < float >::x() const;

或是针对某个个别template function:

template Point3d < float > operator+( const Point3d < float >&, const Point3d < float >& );

 

异常处理

Exception Handling 包括三部分:

1.       一个throw 子句。它在程序某处发出一个exception。被丢出去的exception 可以是内建类型,也可以是使用者自定类型。

2.       一个或多个catcha 子句。每一个catch 子句都是一个exception handler。它用来表示说,这个子句准备处理某种类型的exception,并且在封闭的大括号区段中提供时间的处理程序。

3.       一个try 区段。它被围绕以一系列的叙述句。这些叙述句可能会引发catch 子句起作用。

当一个exception 被丢出去时,控制权会从函数调用中被释放出来,并寻找一个吻合的catch 子句。如果都没有吻合者,那么默认的处理例程terminate() 会被调用。

当一个exception 发生时,编译系统必须完成以下事情:

1.       检验发生throw 操作的函数;

2.       决定throw 操作是否发生在try 区段中;

3.       若是,编译系统必须把exception type 拿来和每一个catch 子句比较;

4.       如果比较吻合,流程控制应该交到catch 子句手中;

5.       如果throw 的发生并不在try 区段中,或没有一个catch 子句吻合,那么系统必须(a)摧毁所有active local objects,(b)从堆栈中将当前的函数“unwind”掉,(c)进行到程序堆栈中的下一个函数中去,然后重复上述步骤2~5。

 

执行期类型识别

C++ 的RTTI 机制提供了一个安全的downcast 设备,但是只对那些展现“多态”的类型有效。但是怎么分辨一个class 是否具有“多态”性质呢?在C++ 中,一个具备多态性质的class,正是内含着继承而来的virtual functions。因此可以把与该class 相关的RTTI object 地址放进virtual table 中(通常放在第一个slot中)。

Type-safe Dynamic Cast(保证安全的动态转型):

Typedef  type *ptype;

Typedef  fct  *pfct;

Simplify_conv_op (ptype pt)

{

   if (pfct pf = dynamic_cast < pfct > ( pt ) ) {

   // …process pf

   }

   else {…}

}

dynamic_cast 的真正成本是:pfct 的一个类型描述器会被编译器产生出来。由pt 指向之class object 类型描述器必须在执行期通过vptr取得。下面是可能的转换:

( ( type_info* ) ( pt->vptr [ 0 ] ) ) -> _type_descriptor;

type_info 是C++ Standard 所定义的类型描述器的class 名称,该class 中放置着待索求的类型信息。

对一个class指针类型施以dynamic_cast 运算符,会获得true 或 false:

n         如果传回真正的地址,表示这个object 的动态类型被确认了,一些与类型有关的操作现在可以施行于其上。

n         如果传会0,表示没有指向任何object,意味应该以另一种逻辑施行于这个动态类型未确定的object 身上。

对一个class 引用类型施以dynamic_cast 运算符,会获得true 或 bad_cast exception.

n         如果reference 真正参考到适当的derived class (包括下一层或下下一层或…),downcast 会被执行而程序可以继续进行。

n         如果reference 并不真正是某一种 derived class,那么,由于不能够传回0,遂丢出一bad_cast exception。

Typeid 运算符:

Typeid( expression )或 Typeid ( type ) 返回一个const reference,类型为tyoe_info.

Simplify_conv_op ( const type &rt )

{

   if  ( typeid ( rt ) = = typeid ( fct ) )

{

   fct &rf = static_cast < fct& > ( rt );

   //…

}

else {…}

}

 

 

Workbench中直接调用ICEM CFD进行网格划分 自从ANSYS 12.0之后,ICEM CFD就从Workbench中被分离出去,作为一个独立的程序使用了。取而代之的是Meshing模块。 在Meshing的属性节点菜单中右键点击Mesh,选择Insert > Method,插入方法。 选择需要划分网格的几何体,点击apply。此时Geometry显示为1 Body。 设置Method为MultiZone,如果不设置成这个的话,找不到进入ICEM CFD的入口。如果要划分四面体,可以在Mapped Mesh Type中选择其他类型。 阅读详情

相关推荐

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错。站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更对的情况总还是好的,特此记录。 拿发票做例子,印章相较于其它部分最大的不同就是印章是红色的,而其它部分不是(这是一句废话)。 那么第一步当然就是将红色分离出来,这一步可以采用Python第三方库OpenCV里的 cv2.split()方法,该方法是把RGB图像的三个通道拆分开来,得...

wl_Honest的博客 1万+

C++对象模型——站在对象模型的尖端 (第七章)

第7章    站在对象模型的尖端 (On the Cusp of the Object Model)     这一章讨论三个著名的C++语言扩充性质,它们都会影响C++对象.它们分别是 template, exception handling(EH)和runtime type identification(RTTI). 7.1    Template     C++程序设计的风格以及习惯

yiranant的专栏 745

计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)

这次实验利用logisim进行设计,进行了以下这四个实验,其中分为汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码,实验报告分为四个部分,在这四个部分中依次对四个实验的方案设计,设计思路进行了介绍

zhang2gongzi的博客 6万+

深度探索c++对象模型之member function的具现行为

对于template 的支持,最困难的就是template function的instatiation【具现】。截至此书问世,大家的编译器提供了两种策略:一个是编译时期策略——模板程序代码必须在program text file【程序文本文件】中备好可用;另一个是编译时起策略,有一些meta-compilation【元编译】工具可以导引编译器的具现行为。       对于编译器的设计者们,必须要

wenpinglaoyao的专栏 828

第二十一篇: `man`, `tldr`, `explain` - 授人以渔的“终极指令”

我们已经一起学习了19个(组)关键命令,从nvidia-smi到kubectl。但这只是GPU运维武器库中的一小部分。技术日新月异,新的工具、新的参数会不断涌现。这个系列的真正目的,不仅是教会你使用这19件“兵器”,更是希望你掌握学习任何一件新兵器的方法论。这套方法论就是你的“终极指令”。授人以鱼不如授人以渔。至此,《GPU运维指令集:20个关键命令的战地手册》系列已全部完结。我们从nvidia-smi出发,一路探索了监控、诊断、容器、集群、网络、性能等各个维度的命令,最后用自动化脚本将它们串联,又用。

weixin_42587823的博客 1351

SpringBoot+Git+Jenkins+K8s容器化部署

SpringBoot+Git+Jenkins+K8s容器一套部署流程

可乐加.糖 471

C/C++编程:模板的具现行为

具现 具现(instantiations):表示程序将真正的类型和表达式绑定到模板相关形式参数上的操作。也叫做实例化 举个例子: template<class Type> Type min(const Type& t1, const Type &t2){} 调用: min(1.0, 2.0); 然后程序就会将Type绑定为double并产生min()的一个程序实体(并适当的mangling),其中t1、t2的类型都是double 模板如何"具现" 对于类模板: templ

OceanStar的博客 702

UE5实战技巧:TextRender高效集成中文字体与材质优化

本文针对UE5中TextRender组件显示中文的常见问题,提供了一套完整的实战解决方案。详细讲解了如何通过手动创建字体资产、精准控制字符集来优化性能,并重点介绍了通过调整材质中的Lerp节点参数(如设为-85, 92)来解决中文字体显示残缺和边缘模糊等核心难题,帮助开发者实现高效且美观的中文文本渲染。

weixin_28040125的博客 382

[读书笔记] - 《深度探索C++对象模型》第6章 & 第7章

1.全局对象 Matrix identity; main() { // identity必须在此处被初始化 Matric m1 = identity; ... return 0; } 像identity这样的所谓global object如果有constructor和destructor的话,我们说它需要静态的初始化操作和内存释放操作。 C++程序中所有的global objects都被放置在程序的data segment中。如果明确指定给它一个值,object将

浮生的博客 264

MOOS-ivp 实验一 MOOS软件的安装与执行

MOOS-ivp实验一 实验一步骤总结 文章目录MOOS-ivp实验一前言一、实验一1.下载软件2.安装必要的插件3.安装后检查4.路径添加5.执行示例文件总结 前言 在moos学习过程中,我觉得最好把学习的每一步骤都总结一下,方便日后进行回顾。moos官网设置了十八个实验,涉及到了moos的各个方面,完成这些实验也是moos入门的好办法。 一、实验一 实验一主要内容仅仅是软件的安装,仅仅这一步就花费了我接近两天的时间。主要问题发生在linux系统的配置问题上。 1.下载软件 svn co https:

weixin_44151170的博客 6671

卷积神经网络中的自注意力机制(Self-Attention Mechanism)

卷积神经网络中的机制表现为操作,其实现过程与Seq2Seq模型的自注意力机制类似。标准的卷积层是一种局部滤波操作,其输出特征上的任意位置是由对应输入特征的一个邻域构造的,只能捕捉局部特征之间的关系。而自注意力机制通过计算任意两个位置之间的关系直接捕捉远程依赖,而不用局限于相邻点,相当于构造了一个的卷积核,从而可以捕捉更多信息。在卷积网络的自注意力机制中,首先构造输入特征x的键特征fx, 查询特征gx和值特征hx;

AI天才研究院 1501

C++对象模型-在对象模型的尖端 第七章笔记

template 编译器看到template class声明时什么也不会做。必须经过具现后才能使用其中变量。 若声明一个template class具现类型的指针后,也是什么也没有。因为指针不需要触发对象的具现。 如果一个virtual function 被具现出一其具现点紧跟在其class具现点之后 异常处理 throw语句会抛出内建类型或自定义类型的异常 catch子句用于处理某种类型的异常,在大括号中提供处理程序 try子句包含着可能抛异常的代码 异常触发后,控制权会从函数调用中被

nwao7890的专栏 271

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 939

《深入探索C++对象模型》之一

前言:        由于经常使用C++,但是又对C++内部机制不是很深入了解,所以看了一些关于C++的经典书籍,其中有《C++ Primer》、《STL源码剖析》、《Efficitive C++》、《More Efficitive C++》。《C++ Primer》特别适合刚使用C++的程序员学习,里面详细介绍了一些C++基础知识,包括流和STL容器、适配器、算法还有C++的面向对象的一些知识。...

杨林峰的笔记 8912

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

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

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

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

深度探索C++对象模型 侯捷

目录 什么是C++对象模型 第一章 关于对象 1.1 C++对象模式 1.2 关键词所带来的差异 1.3 对象的差异 多态 指针的类型 第二章 构造函数语意学 2.1 Default Constructor的构造操作 2.2 拷贝构造器的构造操作 2.3 程序转化语意学 2.4 成员们的初始化队伍 第三章 Data语意学 3.1...

Zy_05_11的博客 3648

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《深度探索C++对象模型》学习笔记 — 站在对象模型的尖端(On the Cusp of the Object Model)

《深度探索C++对象模型》学习笔记 — 站在对象模型的尖端(On the Cusp of the Object Model)一、模板1、模板中的名称决议法 一、模板 1、模板中的名称决议法 C++标准中,模板相关的作用域有两个 —— scope of the template declaration(声明作用域) 和 scope of the template instantiation(实例化作用域) #include <iostream> using namespace std; void

coding-hwz 589

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

本文深入探讨C++对象模型及其底层实现机制,重点分析了虚函数、继承与虚继承对内存布局的影响。文章在64位MSVC环境下,通过具体代码示例展示了类对象的内存结构:非静态数据成员存储在对象内,静态成员和函数存放在对象外;虚函数通过虚函数表实现动态绑定,派生类会扩充修改基类虚函数表;虚继承通过虚基类表解决多继承问题,共享基类子对象。测试数据表明,虚继承会导致更复杂的对象模型,涉及多个虚指针和数据分隔。文章强调对象起始地址对this指针和成员调用的关键影响,为理解C++底层机制提供了重要参考。

Coolbike的博客 912

深度探索C++对象模型

深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C++第一套编译器cfront的设计者所写. 了解C++对象模型, 有助于在语言本身以及面向对象观念两方面层次提升. explicit(明确出现于C++程序代码). implici...

Shirven 235

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

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

strdhgthbbh的博客 601

第7章 站在对象模型的尖端

第7章 站在对象模型的尖端 7.1 Template 这一节的焦点放在template的语意上面, 下面是有关template的三个主要讨论方向: template的声明. 基本来说就是当声明一个template class, template class member function等等时, 会发生什么事情 如何"实例化(instantiates)"class objects, inline...

weixin_30622181的博客 176

深度探索C++对象模型pdf

下载地址:网盘下载内容简介······这本书探索“对象导向程序所支持的C++对象模型”下的程序行为。对于“对象导向性质之基础实现技术”以及“各种性质背后的隐含利益交换”提供一个清楚的认识。检验由程序变形所带来的效率冲击。提供丰富的程序范例、图片,以及对象导向观念和底层对象模型之间的效率测量。举报作者简介······Stanley B...

weixin_30301449的博客 1331

[温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端

前言终于到最后一章啦,准备迎接新的篇章,刚好“霹雳布袋戏”要出新的剧集了,期待ing。这章也是一些零散的知识点。1. 模版的名称决议直接上代码://scope of the template definition extern double foo(double);template < class type > class ScopeRules{ public: void invariant

最帅惋红曲 723

深度探索C++对象模型之站在对象模型的尖端

1,Template(模板): template被用于属性混合(如内存配置策略)或互斥机制(使用于线程同步化控制)的参数化技术之中。它甚至被使用于template metaprograms(模板元编程)技术:class expression templates(类表达式模板)将在编译时期而非执行期被评估,因而带来重大的效率提升。   2,template的三个主要的讨论方向: (1),...

Mr_Loser的博客 258

深度探索C++对象模型 学习笔记 第七章 站在对象模型的尖端(1)

在本章中,我将讨论三种对 C++ 对象模型影响深远的语言扩展:模板(templates)、异常处理(exception handling, EH)和运行时类型识别(runtime type identification, RTTI)。EH(以及 RTTI,它在某种意义上可视为 EH 的副产品)与我在此讨论的其他特性有所不同——因为我从未有机会真正实现它。因此,我的讨论将主要依据 [CHASE94]、[LAJOIE94a]、[LAJOIE94b]、[LENKOV92] 和 [SUN94a]。7.1 Templ

tus00000的博客 172

深入探索C++对象模型之七 --- 站在对象模型的尖端

深入探索C++对象模型之七 — 站在对象模型的尖端template instantiation 模版具现化 template、exception handling和runtime type idetificationTemplate模版只是定义了函数tempalte的声明当我们声明template的时候,编译器对于声明代码是不做任何处理的,只有在程序中使用到了具体类型的类或者函数的时候,编译器才会

Aaron的专栏 552

C++对象模型学习——站在对象模型的尖端

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33670786的博客 278
上一篇: 深入探索C++对象模型 之 执行期语意学
下一篇: Effective C++
C_plus_learner
博客等级 码龄22年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值