【C++】 对象模型与内存模型的区别

news2024/11/23 7:35:39

目录

  • 0 引言
  • 1 C++ 内存模型
  • 2 C++ 对象模型
  • 3 二者区别

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:C++专栏
  • 💥 标题:【C++】 对象模型与内存模型的区别
  • ❣️ 寄语:最重要的只有一件事!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

0 引言

闲聊:❣️随着学习的深入,总是会涉及到内存模型和对象模型。最开始接触这两个概念的时候总是觉得很抽象,什么是模型,三维模型?,显然不是。下面就来学习一下这两个概念❣️

1 C++ 内存模型

C++内存模型描述了C++程序如何在内存中分配和管理内存。它包括栈、堆以及全局/静态存储区等不同的内存区域。

C++内存分区有很多种,从不同的角度可以划分成不同的分区模块,下面就讲述一下通常情况下的分区:

  • 栈(Stack)
    栈是用于存储局部变量函数调用信息的内存区域。
    它在程序运行时动态地增长和收缩。每当函数被调用时,该函数的局部变量和返回地址等信息都会被压入栈中。当函数执行结束后,这些信息会从栈中弹出。栈的分配和释放是由编译器自动管理的,因此栈上的内存是自动分配和释放的,具有较快的分配和释放速度,但大小受到限制。
  • 堆(Heap)
    堆是用于动态分配内存的内存区域。
    它的大小通常比栈大得多,并且可以在程序运行时根据需要动态地分配和释放内存。在堆上分配的内存通过调用new运算符或malloc函数来实现,并且需要手动释放,否则会导致内存泄漏。堆上的内存可以被多个部分共享,并且需要程序员显式地管理。
  • 全局/静态存储区(Global/Static Storage)
    全局存储区用于存储全局变量和静态变量,它在程序的整个生命周期内都存在
    全局变量是在程序开始时就被初始化的,而静态变量则在第一次使用时初始化,并且在程序的整个执行过程中保持其值不变。全局/静态存储区的内存由编译器分配和释放。
  • 常量存储区(Constant Storage)
    常量存储区用于存储常量值,如字符串常量
    这些常量值在程序的整个执行过程中保持不变。常量存储区的内存由编译器分配和释放。
  • 程序代码区(Code Segment)
    程序代码区存储程序的执行代码
    这些代码在程序运行期间是只读的,不可修改。代码区的内存由操作系统加载和管理。

2 C++ 对象模型

在C++对象模型中,一个类的对象通常由成员变量和成员函数组成。成员变量存储对象的状态信息,而成员函数定义了对象的行为。对象的成员变量在内存中按照声明的顺序依次存储,成员函数则是共享的,不会为每个对象创建一份副本。

C++的对象模型还包括对继承关系的支持。当一个类继承自其他类时,它会继承父类的成员变量和成员函数,并可能添加自己的新成员。继承关系在内存中通常通过在对象布局中添加额外的内存来实现。

在C++对象模型中,变量、成员函数和虚函数的组织方式如下

  • 变量的组织
    非静态成员变量,它们按照声明的顺序依次存储在对象的内存中。每个对象都有自己的成员变量副本
    静态成员变量 在类的所有对象之间共享,它们存储在类的静态数据区中,而不是对象的内存中。
  • 成员函数的组织
    非静态成员函数不会存储在对象的内存中。它们被视为类的共享函数,可以在所有对象之间共享
    非静态成员函数通过一个隐藏的额外参数(this指针)来访问调用它们的对象的成员变量
    成员函数的指针存储在类的函数表(也称为虚函数表)中。函数表是一个指针数组,其中每个指针指向相应的成员函数。
  • 虚函数的组织
    虚函数是用于实现多态性特殊类型的成员函数
    类中声明为虚函数的函数被放入虚函数表中。
    每个对象都包含一个指向虚函数表的指针(通常称为虚函数表指针),该指针指向类的虚函数表。
    当通过基类指针或引用调用虚函数时,会根据对象的实际类型在虚函数表中查找相应的函数,并进行动态绑定

3 二者区别

  • C++对象模型和内存模型的主要区别在于它们关注的方面不同
    对象模型关注的是类和对象的组织方式,包括成员变量和成员函数的布局,以及继承关系的处理。
    内存模型关注的是程序运行时内存的分配和管理,包括栈、堆和全局/静态存储区的使用。
  • 对象模型是一种高级的概念,描述了C++语言中类和对象的结构和行为。它帮助我们理解和使用面向对象编程的特性,如封装、继承和多态。
  • 内存模型则更加底层,描述了C++程序在运行时如何使用内存。它涉及到内存的分配和释放,以及变量的作用域和生命周期等方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring(17) AopContext.currentProxy() 类内方法调用切入

目录 一、简介二、代码示例2.1 接口类2.2 接口实现类2.3 AOP切面类2.4 启动类(测试)2.5 执行结果 一、简介 背景: 在之前 Spring 的 AOP 用法中,只有代理的类才会被切入。例如:我们在 Controller 层调用 Service 的方式…

nginx的优化和防盗链(重点)

一、nginx的优化(重点) (一)隐藏版本号 由于nginxbug多,更新版本速度比较快,一旦版本号暴露出去,有可能给对方提供攻击的漏洞 1、在http大模块中修改 2、修改nginx.h源码包 (二&a…

竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 …

leetcode:1929. 数组串联(python3解法)

难度&#xff1a;简单 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言&am…

基于Java的二手车交易管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于深度学习网络的疲劳驾驶检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1疲劳检测理论概述 4.2 本课题说明 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 In_layer_Size [227 227 3]; img_size [224,…

BSPHP 未授权访问 信息泄露

漏洞描述 BSPHP 存在未授权访问 泄露用户 IP 和 账户名信息 漏洞复现 访问url&#xff1a; 构造payload访问&#xff1a; /admin/index.php?madmin&clog&atable_json&jsonget&soso_ok1&tuser_login_log&page1&limit10&bsphptime16004073…

【牛客网刷题(数据结构)】:环形链表的约瑟夫问题

描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; O(n) 示例1 好环形链表的约瑟夫问题是一个经典的问…

cmd/bat 批处理文件的参数/接收命令行参数

前言 略 接收命令行参数 变量 %1~%9 对应命令行参数 1-9变量%0表示自身如果参数超过9个&#xff0c;则需要shift命令 示例 将下面的内容保存为bat文件&#xff08;比如1.bat&#xff09;&#xff1a; echo off echo.%%0为自身 echo.第0个参数是:%0 echo.第1个参数是:%1 e…

ROS 学习 Gazebo仿真

机器人模型添加Gazebo属性 使用xacro设计的机器人URDF模型已经描述了机器人的外观特征和物理特性&#xff0c;虽然已经具备在Gazebo中仿真的基本条件&#xff0c;但是&#xff0c;由于没有在模型中加入Gazebo的相关属性&#xff0c;还是无法让模型在Gazebo仿真环境中动起来。那…

基于Java的大学生兼职论坛管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于STM32_DHT11单总线温湿度传感器驱动

基于STM32_DHT11单总线温湿度传感器驱动 文章目录 基于STM32_DHT11单总线温湿度传感器驱动前言一、DHT11&#xff1f;二、原理1.时序1.主机复位信号和 DHT11 响应信号2.信号‘0’的表示3.信号‘1’的表示4.整个数据信号收发流程 2.数据结构 三、驱动1 .h文件&#xff1a;2 .c文…

力扣-434.字符串中的单词数

Idea 利用C中的 stringstream 指定字符分割字符串 class Solution { public:int countSegments(string s) {int cnt 0;stringstream ss(s);string word;while(ss >> word){cnt;}return cnt;} };

大模型分布式训练并行技术(一)-概述

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&am…

【Java 进阶篇】JavaScript流程控制语句详解

JavaScript是一门高级编程语言&#xff0c;具备丰富的流程控制语句&#xff0c;用于控制程序的执行流程。在本篇博客中&#xff0c;我们将深入探讨JavaScript的流程控制语句&#xff0c;包括条件语句、循环语句、以及其他一些控制语句。这篇博客将逐步介绍这些概念&#xff0c;…

智慧公厕:打破传统,解决城市痛点@中期科技

近年来&#xff0c;随着城市化进程的加速推进&#xff0c;智慧公厕成为人民生活质量提升的重要组成部分。作为一个富有创新和科技感的解决方案&#xff0c;智慧公厕不仅满足了人们对公共环境的要求&#xff0c;还提供了一系列便利的服务&#xff0c;让人们的生活更加舒适、便捷…

LabVIEW在安装了其它的NI软件之后崩溃了

LabVIEW在安装了其它的NI软件之后崩溃了 在安装了其它的NI软件之后&#xff0c;一些原本安装好的或者新安装的软件由于缺少必要的DLL而崩溃掉了。例如&#xff0c;在这种情况下&#xff0c;Teststand可能会报下面的错误&#xff1a; RetrievingCOM class factory for compone…

基于Springboot的闲置图书共享系统设计与实现(源码+论文+开题报告+PPT+部署)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

PixMIM论文笔记

论文名称&#xff1a;PixMIM: Rethinking Pixel Reconstruction in Masked Image Modeling 发表时间&#xff1a;2023 年 3 月 4 日 作者及组织&#xff1a;上海人工智能实验室、西蒙菲莎大学、香港中文大学 GitHub&#xff1a;https://github.com/open-mmlab/mmselfsup/tree/d…

虚幻阴影整理

虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用&#xff0c;它能够实现电影级的品质效果&#xff0c;为大型开放场景提供光照。 …