当前位置: 首页 > news >正文

C++对象模型

思考:对于实现平面一个点的参数化。C++的class封装看起来比C的struct更加的复杂,是否意味着产生更多的开销呢?

实际上并没有,类的封装不会产生额外的开销,其实,C++中在布局以及存取上的额外开销是virtual引起的。

C++对象模式

在C++中,有两种class data members:静态成员和非静态成员。有三种class member functions:静态的,非静态的以及虚函数

C++对象模型

Nonstatic datamembers 被配置于每一个class object之内。static data members则被存放在个别的class object之外。

static 和nonstatic function members也被存放在class object之外(仅一份)

virtual fuction:每一个class产生一堆指向virtual table(vtbl)中;每一个class object被安插一个指针,vptr指向相关的virtual table

(图示) file

关于继承

继承关系也可指定为虚拟(也就是共享)

(图示) file

在虚拟继承的情况下,base class不管在继承串链中被派生多少回,永远只存在一个实例(subobject)

(图示) file

对象模型如何影响程序

(图示) file

对象的差异

程序模型(类C)

char boy[] = "Danny";
char *p_son;
...
p_son = new char [strlen(boy) + 1];
strcpy(p_son,boy);
...
if(!strcmp(p_son,boy))take_to_disneyland(boy)

抽象数据类型(ADT)

string girl = "Anna";
string daughter;
...
//string :: operator = ()
daughter = girl;
//string::operator==()
if(girl == daughter)take_to_disneyland(girl);

面对对象编程

void
check_in(Library_materials *pmat)
{
if(pmat->late() )pmat->fine();
pmat->check_in();
if(Lender *plend = pmat->reserved())pmat->notify(plend);
}

多态实现

在C++中,多态只存在于一个个的public class体系中

有这样三种多态支持:

经由一组隐式的转化操作。例如把一个derived class指针转化为一个指向public base type的指针;

shape *ps = new circle();

经由virtual fuction机制

ps->rotate();

经由dynamic_cast和typeid运算符;

if(circle pc = dynamic_cast<circle>(ps))..

思考:需要多大内存才能够表现一个class object?

非静态数据成员(non-static data members):非静态数据成员是每个类对象都需要独立分配的,所以其大小需计算在内。

虚函数表指针(vptr):如果类含有虚函数,则需要一个指针指向虚函数表,用于动态绑定。这个指针的大小通常是机器字长,比如64位系统为8字节。

内存对齐填充(padding):为了优化内存访问效率,编译器会在类成员之间插入内存对齐填充。

其他系统占用空间:除了类自身需要的空间外,一些编译器和系统会在类对象中预留一些额外空间,例如运行时类型信息(RTTI)。

所以一个类对象所需内存的计算公式概略为:对象内存 = 非静态数据成员大小总和 + (含虚函数则加上vptr指针大小) + 填充大小 + 其他系统占用大小

其中除了非静态数据成员外,其他部分大小在不同系统和编译器下可能有所不同。

一个更准确的计算对象大小的方法是:在程序中使用sizeof运算符,它会返回这个平台下该类对象的确切字节大小。 

注意:

类中静态数据成员(static data member)与对象的内存大小无关。

静态数据成员不属于类的任何一个对象,只会在程序的整个生命周期内有一份内存拷贝存在。

所以静态数据成员不会影响每个类对象实例的内存需求。 指针的类型

例子:

ZooAnimal  *px;
int *pi;
Array<string>*pta;

从内存上面看,这几个指针没有什么区别,大小是一个机器地址。(word)

但是其实,“指针类型”会教导编译器如何解释某个特定地址中的内存内容以及大小。

(图示) file 进一步探讨:

Bear b; ZooAnimal za=b; //译注:这会引起切割(sliced) //调用 ZOOAnimal::rotate() za.rotate();

为什么rotate所调用的是ZooAnimal实例而不是Bear实例?此外,如果初始化函数(译注:应用于上述assignment操作发生时)将一个object内容完整拷贝到另个object去,为什么za的vptr 不指向Bear的virtual table?

ZooAnimal za = b;这行代码中,使用基类ZooAnimal的引用或指针初始化时,编译器会:

  1. 为za分配一个ZooAnimal类型的空间
  2. 把b对象中的ZooAnimal部分的数据拷贝过来

也就是说,这个赋值操作生成了一个新的ZooAnimal对象,它只包含了原b对象中的ZooAnimal部分的数据和函数,丢失了b作为Bear的额外信息。

然后za调用rotate()时,编译器根据静态类型(ZooAnimal)调用ZooAnimal::rotate(),而不是动态类型Bear::rotate()。

如果想保留全部信息,可以使用指针或引用:cpp Bear b; ZooAnimal* za = &b; za->rotate(); // 调用Bear::rotate()

或者使用动态绑定:cpp Bear b; ZooAnimal& za = b; za.rotate(); // 调用Bear::rotate()

编译器在将一个class object指定给另一个class object之间做出仲裁,编译器必须保证如果某个object含义一个或者以上的vptrs,那些vptrs不会被base class 改变。

补充:

当一个base class object 被直接初始化为(或是被指定为)一个 derived classobject 时,derivedobject 就会被切(sliced)以塞入较小的 base type 内存中,derivedtype将没有留下任何蛛丝马迹。多态于是不再呈现,而一个严格的编译器可以在编译时期解析一个“通过此object而触发的virtualfunction调用操作”,因而回避virtual机制。如果virtualfunction 被定义为inline,则更有效率上的大收获。

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

C++对象模型

思考&#xff1a;对于实现平面一个点的参数化。C的class封装看起来比C的struct更加的复杂&#xff0c;是否意味着产生更多的开销呢&#xff1f; 实际上并没有&#xff0c;类的封装不会产生额外的开销&#xff0c;其实&#xff0c;C中在布局以及存取上的额外开销是virtual引起的…...

Linux Framebuffer驱动框架、接口实现和使用

Linux 驱动-Frame Buffer代码分析 Framebufferfbmem.c部分代码分析初始化 Framebuffer 对于驱动开发人员来说&#xff0c;其实只需要针对具体的硬件平台SOC和具体的LCD&#xff08;通过焊接连接到该SOC引脚上的LCD&#xff09;来进行第一部分的寄存器编程&#xff08;红色部分&…...

AI:54-基于深度学习的树木种类识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

MVCC详解

什么是MVCC&#xff1f; MVCC&#xff0c;即Multi-Version Concurrency Control &#xff08;多版本并发控制&#xff09;。它是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 通俗的讲&am…...

[pytorch]手动构建一个神经网络并且训练

0.写在前面 上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么…...

马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力?新消息泄露该模型支持2.5万个字符上下文!

本文原文来自DataLearnerAI官方网站&#xff1a; 马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力&#xff1f;新消息泄露该模型支持2.5万个字符上下文&#xff01; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051699114783001 马斯克透露xAI…...

spring-session-core排除某些接口不设置session

这里写自定义目录标题 需求实现 需求 今天先写一下如何实现&#xff0c;之后再更新一篇如何发现这个问题的。 我们的项目使用了spring-session-core来存储共享session&#xff0c;存在redis中&#xff0c;然后在cookie中是设置了key为SESSION的session。但是我们有一些开放接口…...

【ElasticSearch系列-05】SpringBoot整合elasticSearch

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...

C/S架构学习之广播

广播&#xff1a;一台主机可以将一个数据包同时发送给同一局域网内所有主机&#xff1b;在IPV4中&#xff0c;广播地址是本网段最大的IP地址或者“255.255.255.255”&#xff1b;注意&#xff1a;广播本质上是UDP通信技术&#xff1b;只有用户数据报套接字才能使用广播的方式&a…...

帧间快速算法论文阅读

Low complexity inter coding scheme for Versatile Video Coding (VVC) 通过分析相邻CU的编码区域&#xff0c;预测当前CU的编码区域&#xff0c;以终止不必要的分割模式。 &#x1d436;&#x1d448;1、&#x1d436;&#x1d448;2、&#x1d436;&#x1d448;3、&#x…...

mooc单元测验第一单元

TCP和OSI参考模型对比 OSI参考模型与TCP/IP参考模型(计算机网络)_osi模型 tcpip模型_李桥桉的博客-CSDN博客 会话层和物理层...

AOC显示器出问题了?别担心,简单重置一下就OK了

你的AOC显示器有问题吗&#xff1f;它是被卡在特定的屏幕上还是根本不显示任何图像&#xff1f;如果你的显示器出现任何问题&#xff0c;只需简单重置即可解决问题。 重置AOC显示器可以帮助解决一系列问题&#xff0c;例如颜色或显示设置问题、输入源检测问题以及其他与软件相…...

ok-解决qt5发布版本,直接运行exe缺少各种库的问题

已实验第二种方法可用。 工具&#xff1a;电脑必备、QT下的windeployqt Qt 官方开发环境使用的动态链接库方式&#xff0c;在发布生成的exe程序时&#xff0c;需要复制一大堆 dll&#xff0c;如果自己去复制dll&#xff0c;很可能丢三落四&#xff0c;导致exe在别的电脑里无法…...

【JavaEE】cookie和session

cookie和session cookie什么是 cookieServlet 中使用 cookie相应的API Servlet 中使用 session 相应的 API代码示例: 实现用户登陆Cookie 和 Session 的区别总结 cookie 什么是 cookie cookie的数据从哪里来? 服务器返回给浏览器的 cookie的数据长什么样? cookie 中是键值对…...

关于CSS的几种字体悬浮的设置方法

关于CSS的几种字体悬浮的设置方法 1. 鼠标放上动态的2. 静态的&#xff08;位置看上悬浮&#xff09;2.1 参考QQ邮箱2.2 参考知乎 1. 鼠标放上动态的 效果如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><met…...

心脏骤停急救赋能

文章目录 0. 背景知识1. 遇到有人突然倒地怎么办1.1 应急反应系统1.2 高质量CPR1.2.1 胸外按压1.2.2 人工呼吸 1.3 AED除颤1.3.1 AED用法 1.4 高级心肺复苏1.5 入院治疗1.6 康复 0. 背景知识 中国每30s就有人倒地&#xff0c;他们可能是工作压力大的年轻人&#xff08;工程师群…...

Android 13.0 根据app包名授予app监听系统通知权限

1.概述 在13.0的系统rom产品定制化开发中,在一些产品rom定制化开发中,系统内置的第三方app需要开启系统通知权限,然后可以在app中,监听系统所有通知,来做个通知中心的功能,所以需要授权获取系统通知的权限,然后来顺利的监听系统通知。来做系统通知的功能,接下来来实现…...

校园招聘系统

校园管理系统 公共模块学生端游客端企业联系人端校内管理员端超级管理员端企业端 公共模块 登录 用户可以通过验证码、账号密码进行登录。 个人中心 学生端 学生主要为查看招聘信息以及投递等。 首页 简历详情投递 双选会公司详情 公告通知 学生端主要为这些等等&#xf…...

SpringBoot-SpringCache缓存

文章目录 Spring Cache 介绍常用注解 Spring Cache 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;…...

服务器带宽忽然暴增,不停的触发告警

问题&#xff1a; 线上环境&#xff0c;服务器的外网下行带宽达到某个阈值&#xff0c;触发告警&#xff0c;查了下服务器的带宽监控信息&#xff0c;是从某个时间开始突然串上去的&#xff0c;然后监控图形非常有规律&#xff0c;都是每秒达到顶峰后&#xff0c;又立马下去了…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...