首页 > 系统相关 >C++对象内存模型

C++对象内存模型

时间:2023-08-28 17:14:11浏览次数:36  
标签:函数 对象 模型 C++ 内存 对齐 变量 指针

根据前面讲过的知识,C++ 的对象内存模型主要包含了以下几个方面的内容:

  • 如果没有虚函数也没有虚继承,那么对象内存模型中只有成员变量。
  • 如果类包含了虚函数,那么会额外添加一个虚函数表,并在对象内存中插入一个指针,指向这个虚函数表。
  • 如果类包含了虚继承,那么会额外添加一个虚基类表,并在对象内存中插入一个指针,指向这个虚基类表。

 

为什么虚函数就能实现多态?

因为在没有虚函数的时候,指针指向一个对象,会调用基类或者派生类的哪一个函数,是看这个指针的类型所决定的

而当这个类或者父类中有定义虚函数的时候,内存模型里就会多一个虚表指针vptr,这时候调用函数就不会根据指针类型,而是根据指针指向的对象,从对象的虚表指针找到虚表,从根据函数名找到在虚函数表里的位置,推算得到入口地址,从而执行该入口的函数。

 

 

成员变量就有内存的要求,所谓内存对齐,就是在分配内存时,数据会按照一些对齐规则在内存中进行对齐的存储,提高数据读取效率。

原则1:每一个成员变量都有一个对齐数,这个对齐数由该数据结构的字节占用和当前编译默认对齐数取较小值。表明这个成员变量需要从内存为对齐数的整数倍位置开始存储这样读取的效率比较高。(默认对齐数可以通过prama pack(n)修改)

原则2:原则1说明了下标起始位置,但没有指明补齐。补齐是指该成员变量后面还有其他变量的话,那后面的变量下标也有下标起始位置的对齐要求,从当前存储下标的末尾到下一个变量对齐的起始位置之间的内存会被填充补齐。

原则3:结构的总占用空间大小是所有成员变量对齐数中最大的一个的整数倍。

标签:函数,对象,模型,C++,内存,对齐,变量,指针
From: https://www.cnblogs.com/synapse331/p/17662830.html

相关文章

  • C++面向对象进阶
    C++中的拷贝是啥意思?是利用一个已经存在的对象创建一个新对象,用已经存在的数据初始化新对象的内存。对象创建有两个阶段:1.分配内存2.进行初始化   是不是new关键字的使用s1(s2),s1=s2,s1=1,类似这种都是以拷贝的方式完成的初始化,区别只是有没有进行隐式的类型转......
  • cocos2dx 3.x C++搭建protobuf环境
    Cocos2dx里面在网络游戏通信这一块一般我们都会采用protobuf来进行通信,cocos引擎没有集成C++的protobuf,那我们只能自己来集成了。因为protobuf有很多版本,那么我们怎么去下载与引擎中想对应的protobuf版本呢。他在cocos2d-x\tools\simulator\libsimulator\lib\protobuf-lite在这里......
  • 如何用大模型解决产业场景实战问题?案例精讲教程来了!
    科技爆炸,大模型赋能千行百业生成式AI正以惊人的势头改变着我们的世界,新的浪潮席卷着全球各个行业,同时,也赋予企业前所未有的创新力量。大模型通过海量数据和复杂算法,刻画出AI世界的精妙法则,让企业能够借助大模型,解决一系列问题。因此,大模型技术对于企业来说至关重要,基于大模型技术......
  • 四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队
    导读本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。读者可以重点关注NAT模型到DR模型演进的原因(一种技术的诞生......
  • 03 通信模型
    OSI参考模型OSI模型(OpenSystemsInterconnectionModel),由国际化标准组织ISO(TheInternationalOrganizationforStandardization)收录在ISO7489标准中并于1984年发布。OSI参考模型又被称为七层模型,由下至上依次为:物理层:在设备之间传输比特流,规定了电平、速度和电缆......
  • ReadKey C vs C++ vs C#
    ViewFullVersion:Cvs.C++vs.C#Lucky06-22-2012,09:48PMHi.Iamacomputerscientist.ThisisacomparisonofmemoryusageforasimplehelloworldapplicationbetweenC,C++,andC#.CompiledVS201032-bitx86Release.//C#//1,968kusingSy......
  • JVM 内存大对象监控和优化实践
    作者:vivo互联网服务器团队-LiuZhen、YeWenhao服务器内存问题是影响应用程序性能和稳定性的重要因素之一,需要及时排查和优化。本文介绍了某核心服务内存问题排查与解决过程。首先在JVM与大对象优化上进行了有效的实践,其次在故障转移与大对象监控上提出了可靠的落地方案。最后,总......
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景二
    3.创建其他应用或其他Module的Context基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。调用createModuleCon......
  • JVM系列一:JVM内存组成及分配
    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存      按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种......
  • 简单的将pytorch模型部署到onnx
    1.创建一个pytorch模型这里我用的U2Net,直接加载好训练出的权重model=U2Net(class_nums=4)model.load_state_dict(torch.load(checkpoint_path))2.将pytorch模型转成onnx格式x=torcg.randn(1,3,512,512)withtorch.no_grad():torch.onnx.export(......