【C++】深度探索C++对象模型之Function语意学

Python语言在工业控制中的简单应用 在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。 阅读详情

一、Member的各种调用方式

1. Nonstatic Member Functions

首先给出nonstatic member function 和 nonmember function

float magnitude3d( const Point *_this ) { ... } // nonmember function
float Point3d::magnitude3d() const { ... } // nonstatic member function
对于C++中class中的非静态成员函数,都会转化成对等的 “ nonmember 函数实例 ”, 也就是

float magnitude3d( const Point3d* _this ) {
    return sqrt( _this->x * _this->x + 
                     _this->y * _this->y +
                     _this->z * _this->z );
}
上式就是通过对 nonstatic member function

float Point3d::magnitude3d() const { ... } // nonstatic member function
改写成nonmember function的过程。转化步骤如下:

  1. 改写函数的原型以安插一个额外的参数到member function中,此例为_this指针。以及const nonstatic member
  2. 对每个“nonstatic data member的存取操作” 改成this指针来存取,也就是 _this->x 等
  3. 将member function重新写成一个外部函数。 也就是对上式改写成类似
     extern magnitude__7Point3dFv( register Point3d *const this );
        调用操作抑由 obj.magnitude() 改写成 magnitude__7Point3dFv( &obj );
        而 ptr->magnitude() 改写成 magnitude__7Point3dFv(ptr) ;
上述经过named return value函数的内部转化还没被改写成
void normalize_7Point3dFv( register const point3d *const this, Point3d &__result )
{
    register float mag = this->magnitude();
    _result.Point3d::Point3d( this->x_mag, this->y_mag, this->z_mag );
    return;
}

名称的特殊处理
对于member的名称,一般前面会加上class名称,以形成独一无二的命名。 也就是mangling 手法来提供独一无二的名称。
Name mangling 就是通过内部的编码对函数名称申明唯一的实例。
如果名称不一致,会导致编译器在链接时期因无法决议而失败,也就是确保类型安全的链接行为。

2. virtual Member funtions

如果normalize()是一个virtual member function,那么以下调用
ptr->normalize();
会被转换为:
(* ptr->vptr[1])( ptr );
  • vptr即指向virtual table的指针
  • 1是virtual table slot的索引值,也就是指向virtual table上的哪个函数的下标,这里是关联到normalize
  • 第二个ptr表示this 指针。

3. static member function

如果 Point3d::normalize()是一个static member function, 那么以下调用:
obj.normalize();
ptr->normalize();
一般都会转化为以下nonmember函数的调用,也就是
// obj.normalize();
normalize_7Point3dSFv();
// ptr->normalize();
normalize_7Point3dSfv();

在引入static member function之前,C++要求所有的成员函数必须由class的object来调用
而实际上,只有当一个或者多个nonstatic data member在member function中被直接存取时,才需要class object。这个this指针绑定着object对应的member之上。
因此,如果class的设计者,把static data member声明为nonpublic,那么就必须提供一个或多个member function来存取该member。因此可以不靠class object来存取一个static member,但其存取函数却得绑定于一个class object之上。

如果希望支持“没有 class object 存在”,那么程序的解决之道是把0强制转化为一个class指针,因而提供一个this指针实例。
object_count( (Point3d*) 0);

static member function 的主要特性是没有this 指针,其余特性如下:
  • 它不能直接存取其class中的nonstatic members
  • 它不能被申明为const , volatile 或者 virtual
  • 它不需要经由class object才被调用。

【如果取一个static member function的地址,获得的讲师其在内存中的位置,也就是其地址。】
【由于static member function没有this指针,所以其地址类型并不是一个“指向class member function的指针”,而是一个“nonmember 函数指针”。】
也就是说调用
&Point3d::object_count();
获取的是
unsigned int(*) ();
而不是
unsigned int( Point3d::* ) ();

因此static member function的好处是成为一个callback函数,也可以应用于线程threads之上。

二、virtual member function

在C++中,多态(polymorphism)表示:以一个public base class的指针(或reference),寻址出一个derived class object。
比如:
Point *ptr;
ptr = new Point2d;   //寻址出一个Point2d的对象
ptr = new Point3d;   //寻址出一个Point3d的对象

欲鉴定哪些classes展现多态特性,我们需要额外的执行期信息,因此识别一个class是否支持多态的唯一适当方法,是看看是否含有virtual function。

virtual function的一般实现模型:每一个class有一个virtual table,内含class之中有作用的virtual function的地址。然后每个object都有一个vptr,指向virtual table的所在。


为了支持virtual function的机制,必须首先对于多态对象有某种形式的“执行期类型判断法(runtime type resolution)”。


假如有例子如下:

Point *ptr1, *ptr2;
ptr1 = new Point2D;
ptr2 = new Point3D;
ptr1->z();


其中z()是一个virtual function, 为了在执行期调用正确的z(), 需要知道

  • ptr所指对象的真实类型
  • z()实例的位置
所以在实现上,我们需要为每一个多态的class object增加两个members
  • 一个字符串或数字,表示class的类型
  • 一个指针,指向某表格,表格中有程序的virtual function的执行期的地址。
    注意,上述所说的地址在程序执行之后,表格的大小和内容都不会改变。
如何寻址?
  • 为了找到表格,每一个class object被安插了一个由编译器内部产生的指针,指向该表格
  • 为了找到函数地址,每一个virtual function被指派一个表格索引值。
每一个class只会有一个virtual table, virtual table的存储内容?
每一个table内含其对应的class object中所有active virtual function函数实例的地址, 包括:
  • class所定义的函数实例,overriding可能存在的base class virtual function的函数实例
  • 继承自base class的函数实例。即derived class决定不改写virtual function时才出现的情况
  • pure_virtual_called()函数实例,扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。
每一个virtual function都被指派一个固定的索引值也就是slot,这是为了索引在上述所说的active virtual function在virtual table中的编号或者地址。
在单一继承中,一般每个上述的active virtual function的实例在virtual table中的布局的slot是一致的。所以对于调用
ptr->z();
以上信息足够使得编译器将调用转化为:
(*ptr->vptr[ 4 ])(ptr);
唯一在执行期才能够知道的东西是:slot 4到底是指向哪个z()的实例。


1. 多重继承下的virtual function

假设我们有以下的继承关系:
class Derived : public Base1, public Base2;
其中三个类中分别有虚析构函数,成员函数mumble(), 以及对应对象的clone()函数。如Base2
virtual ~Base2();
virtual void mumble();
virtual Base2 *clone() const;
当执行下述语句时:
Base2 *pbase2 = new Derived;
此时新的Derived对象的地址必须调整以指向其Base2 subobject。编译器会产生以下代码:
Derived *temp = new Derived;
Base2 *pbase2 = temp ? temp + sizeof(Base1) : 0;
而当程序删除pbase2所指的对象时,如
delete pbase2;
此时指针将会再次被调整,以指向Derived对象的起始处。上述的offset的加法在编译时期不能直接设定,因此pbase2所指的真正对象只有在执行期才会确定。

在多重继承下,一个derived class内含n-1个额外的virtual table,n表示其上一层base classes的个数。派生类的虚函数表是与基类共享的,所以有几个基类,就会有几个虚函数表,其中第一个虚函数表是派生类最最左的基类共享的。
问题:符号名称的链接很慢,如何解决?
      --> 为了调节链接器的效率,就把多个virtual table连锁成一个。指向次要表格的指针由主要表格的指针加上一个offset-->因此最终每个class只有一个具名的vtable。

2. 虚拟继承下的virtual Functions

假如:
class Point3d : public virtual Point2d
则面对于Point3d的virtual function的布局而言。
Virtual Table Point3d的第一个值是一个offset to virtual base,指向Point2d subobject。 而在Point2d subobject中则有另一个vptr指向Virtual table Point2d subobject of Point3d。



参考:

深度探索C++对象模型,侯捷,  第四章 Function语意学














 


TSN新技术,让您的设备网络“更实时、更确定、更安全” 近日,工业和信息化部发布了2022年第23号公告,批准发布行业标准YD/T 4134-2022《工业互联网时间敏感网络需求及场景》。该标准是国内首个时间敏感网络(TSN)技术标准,标志着我国TSN技术标准体系建设迈出了坚实的一步,对构建工业互联网网络标准体系具有重要意义。TSN源于Time-Sensitive Networking的缩写,中文译名为时间敏感网络,因其具备的确定性和微秒级交互特性,受到了对实时性要求较高的工业控制领域的关注。TSN与工业数智化。 阅读详情

相关推荐

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

深度探索C++对象模型--Function语意学

深入探索c++对象模型

isunn的专栏 690

从FP16到FP8:我是如何让Stable Diffusion 3.5提速40%而不丢画质的

本文分享了StableDiffusion模型优化的实战经验。通过FP8精度转换、分层处理敏感模块,实现显存占用降低35%、推理速度提升40%。文章详细介绍了提升画质的五大技巧、本地/云端/移动端部署方案,以及二次元模型定制等垂直领域应用。同时总结了硬件兼容性、数据质量等七大常见陷阱,并强调持续监控和伦理考量。作者指出未来应关注MoE架构、注意力机制优化等方向,认为技术优化是持续追求性能与质量平衡的过程。

达则兼济天下 1186

深度探索C++对象模型 Function语意学笔记

    为什么C++可以进行函数重载呢?因为C++对函数进行编译的时候,对函数进行了重命名。即函数名称+参数数目+参数类型=新的函数名称。    对于虚拟成员函数,如果normalize()是一个虚拟成员函数,则以下的调用:    ptr->normalize();    将会被内部转化为: ( *ptr->vptr[1] )( ptr ); //第二个ptr表示this指针。    类似的,如果magnitude()也是一个虚拟函数的话,它将被转换如下:    register float mag = m

caianye的专栏 1104

【深度学习新浪潮】OpenClaw跟机器人行业有哪些很好的研究结合点?

OpenClaw正通过"AI大脑+机器人肢体"的深度融合,重新定义机器人与人类的交互方式和自主操作能力。近期ROSClaw框架发布、人形机器人集成和空间计算试验等进展,标志着OpenClaw已从概念验证阶段进入实际应用落地期,为机器人行业带来了自然语言控制普及化具身智能平民化和跨平台开发标准化三大变革机遇。

专注:太空算力、AI infra、异构调度、大模型成本工程 228

基于XGBoost的混凝土力学性能预测系统

本文介绍了一个基于XGBoost算法的混凝土力学性能预测系统。该系统通过模拟生成3000组混凝土配合比数据(包含水灰比、水泥用量和龄期三个关键特征),利用XGBoost强大的非线性建模能力预测混凝土抗压强度。研究背景源于传统混凝土性能测试方法耗时耗力的痛点,该系统可显著减少实验次数,优化配合比设计。系统实现包括:数据生成与特征工程(模拟真实工程数据并添加噪声和异常值)、XGBoost模型构建、以及预测性能评估。XGBoost算法因其处理非线性关系能力强、鲁棒性好等优势被选用,可为智能建造和数字化施工提供技术

huanghm88的专栏 128

深度探索C++对象模型 4.Function语意学

C++支持三种类型的成员函数:static、nonstatic和virtual,每一种类型被调用的方式都不相同。 4.1 Member的各种调用方式 非静态成员函数 设计准则  C++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率。 成员函数转化为非成员函数 转化步骤 1.改写函数原型,安插this指针到成员函数中(this指针指向对象数据的首地址) //non-const nonstatic member函数的扩张过程 Point3d Point3d::magnitude(Poin

ziggy7的博客 235

【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应

最近项目中需要用到大疆无人机遥控器对程序中无人机进行控制,遥控器是下图这一款:博主发现接入手柄这块的可以参考的内容非常少,对于大疆遥控器的控制更是没有。博主经过一番研究,终于理通了这块的遥控器摇杆数据的控制。并且将解决思路分享出来,希望对大家有所帮助。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2817

《深度探索C++对象模型》—Function语意学(The Semantics of Function)

Function语意学(The Semantics of Function)Member的各种调用方式Nonstatic Member FunctionsC++的设计准则之一:nonstatic member function 至少必须和一般的nonmember function有相同的效率。编译器内部会将“member函数实体”转换为对等的“nonmember函数实体”://1. 改写函数签名,安

jiange_zh的博客 1215

HTML金色流星雨(完整代码)

HTML实现金色流星雨动态效果的完整代码。

AIGC 992

QCC305x-QCC304x系列开发教程之应用程序子系统详解 嵌入式

本文对QCC305x-QCC304x系列芯片的应用程序子系统进行了详细解析,并给出了一个LED闪烁的示例代码。嵌入式系统的开发既需要理论知识的支持,也需要实践经验的积累,希望本文能够为读者在QCC305x-QCC304x系列芯片的开发中提供一些有益的指导。QCC305x-QCC304x系列芯片提供了丰富的外设接口,包括UART、SPI、I2C等,开发者可以根据需求选择适合的接口进行数据传输和控制。QCC305x-QCC304x系列芯片的应用程序子系统是整个嵌入式系统的核心部分,负责管理和执行各种应用程序。

CodeMaven的博客 224

深度探索C++对象模型——Function语意学

前言:最近在读《深度探索C++对象模型》,收获不小,整理一些笔记,一来总结加体悟,二来希望以后在某些知识点的遗忘时能快速拾起也希望对读者有一定的帮助。C++支持三种类型的成员函数static nonstatic virtualstatic成员函数 静态成员函数不能直接存取非静态成员(包括静态成员数据和静态成员函数):因为静态成员函数是属于类的,不属于任何一个对象,在类对象创建以前就已经存在了。而

the_scent_of_th_soul的博客 605

YOLOv11 TensorRT极致加速:C++部署性能优化完全指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 114

深度探索C++对象模型——4_Function语意学

深度探索C++对象模型

wogan101的博客 234

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《深度探索C++对象模型》chapter4:Function语意学

目录1 Member的各种调用方式1.1 非静态成员函数1.2 虚拟成员函数1.3 静态成员函数2 虚拟成员函数2.1 单一继承下的虚函数2.2 多重继承下的虚函数2.3 虚拟继承下的虚函数3 指向成员函数的指针4 内联函数 1 Member的各种调用方式 1.1 非静态成员函数 C++的设计准则之一:nonstatic member function至少必须和一般的nonmember function有相同的效率。 //Point3d::magnitude() float Point3d::magnitu

weixin_42323999的博客 363

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【深度探索C++对象模型】第四章 Function语意学

Member的各种调用方式Nonstatic Member Functions​ C++要求非静态成员函数必须要和一般的非成员函数具有相同的效率。采取的措施是通过以下步骤将成员函数实例转换为对等的非成员函数实例:改写函数的原型(signature)以安插一个额外的参数this到成员函数中,用以提供一个存取管道将每一个对非静态成员变量的存取操作改为经由this来存取将成员函数重新写成一个外部函数,将...

stt2019 541

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

问答学习《深度探索C++对象模型》系列

经过数次翻看《深度探索C++对象模型》和翻看别人的笔记,还是决定自己动手写一下该本书的笔记。笔记采用问答的方式是因为在UC实习时我的指导老师的影响:你不要为了看书而看书,你要从中学到东西就要带着疑问去学习。于是有了这一系列的笔记,感谢我的指导老师让我明白:生命不息,学习不止。 第一章:《深度探索C++对象模型》读书笔记之关于对象 第二章:《深度探索C++对象模型》读书笔记之构造函数语意学 第

冰枫的随笔 1335

深度探索C++对象模型:4.Function语意学

第四章: Function语意学 Nonstatic Member Functions(非静态成员函数) Point3d obj; Point3d *ptr = &obj; Point3d Point3d::normalize() const{ register float mag =magnitude(); Point3d normal; normal._...

系统 运维 270

《深度探索C++对象模型》第四章 Function语意学收货

目录 1.编译器对类普通成员函数的处理 2.编译器对静态成员函数的处理 3.编译器对虚函数的处理 4.虚函数指针和虚函数表 5.虚函数继承中的几种情况区分 情况一: 情况二: 情况三: 情况四: 6.多重继承下的虚函数表布局 ???但是其中对于打星号的调整this指针的项不是很理解。 7.inline关键词理解 1.编译器对类普通成员函数的处理 我们知道,其实类是编译...

qq_34489443的博客 349

《深度探索C++对象模型》--4 Function语意学

1、member的各种调用方式 (1)nonstaticmember functions C++的设计准则之一就是:非静态成员函数至少必须和一般的非成员函数有相同的效率,编译器内部将成员函数转换为对等的非成员函数实体。通过安插this指针和mangling等完成。 (2)namemangling(名字的特殊处理) 使名字独一无二,函数的signature为函

KUAILE123的专栏 1206

《深度探索C++对象模型》读书笔记第四章:Function语意学

C++中类的非静态成员函数和一般函数具有相同的效率,编译器内部会将成员函数转化为对等的普通函数实体,比如加上 this 指针。一般而言,编译器对函数会用 ”mangling“ 手法进行命名处理,这也是函数重载的支持手段。独立于 class object 之外的存取操作,在某个时候特别重要。比如说 static 成员函数,它的主要特性是没有 this 指针,因此差不多等同于非成员函数,所以它可以成为

FreeeLinux's blog 653

《深度探索C++对象模型》阅读笔记 第四章 Function语意学

Nonstatic Member Functions(非静态成员函数) C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。 名称的特殊处理(Name Mangling)一般而言,member的名称前面会被加上class名称,形成独一无二的命名。 Virtual Member Functions(虚拟成员函数) vptr表示由编译器产生的指针,指向virtual table。它被安插在每一个“声明有(或继承自)一个或

哇咔咔的博客 377

【深度探索C++对象模型读书笔记】【第4章】Function语意学

1、 C++支持三种类型的member functions,static、nonstatic和virtual,每一种类型被调用的方式都不相同。 2、C++的设计准则之一便是nonstatic member function至少必须和一般的nonmember function有相同的效率。编译器内部会将member函数实例转换为对等的nonmember函数实例,转换步骤为: a)  改写函数

ruan875417的专栏 553

[读书笔记] - 《深度探索C++对象模型》第4章 Function语意学

1. Member的各种调用方式 C++支持三种类型的member functions: static、nonstatic和virtual,每一种类型被调用的方式都不相同。 1.1 Nonstatic Member Functions C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。下面是一个nonmember function的定义: float magnitude3d(const Point3d* _

浮生的博客 408

深度探索C++对象模型(四)Function语意学

C++支持三种类型member functions:static、nonstatic和virtual,每一种类型被调用的方式都不相同。 (一)Member的各种调用方式1、Nonstatic Member Functions(非静态成员函数) C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。也就是说,如

Super的博客 888

《深度探索C++对象模型》 读书笔记:第四章 Function 语意学

4.1Member的各种调用方式 Nonstatic Member Functions(非静态成员函数) C++的设计准则之一就是:nonstatic member function 至少必须和一般的nonmember function有相同的效率 名称的特殊处理 一般而言,member的名称前面会被加上class的明后才能,形成独一无二的命名,也就是mangling手法。对于member...

junya_zhang的博客 385
上一篇: 【C++】深度探索C++对象模型之构造、析构、拷贝语意学
下一篇: 【STL】next_permutation的实现
小do在努力
博客等级 码龄16年 58粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值