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

内存分区学习

1.栈区

实现函数调用,编译器自动分配释放。

2.堆区

存放动态分配和释放的内容,new 和 delete

3.全局/静态存储区

存放全局变量和静态变量,程序结束时释放。

4.数据段(全局/静态存储区)

存放初始化了的全局变量和静态变量

此段数据在程序运行前分配,运行结束后释放。

5.BSS段

存放未初始化的全局变量和静态变量

6. 代码区(Text Segment)

存放程序的二进制代码和常量,代码段时只读的。

存放字符串字面量和const 变量的初始值值。

7. 对象内存布局

(1)简单非多态内存布局

class X {int     x;float   xx;public:X() {}~X() {}void printInt() {}void printFloat() {}
};
      |                        |          |------------------------| <------ X class object memory layout|        int X::x        ||------------------------|  stack segment|       float X::xx      |       |   |------------------------|       ||                        |      \|/|                        |    |                        |
------|------------------------|----------------|         X::X()         | |------------------------|       |   |        X::~X()         |       ||------------------------|      \|/|      X::printInt()     |  text segment|------------------------||     X::printFloat()    ||------------------------||                        |           

(2)同时具有虚函数和静态数据成员的内存布局

class X {int         x;float       xx;static int  count;public:X() {}virtual ~X() {}virtual void printAll() {}void printInt() {}void printFloat() {}static void printCount() {}
};
      |                        |          |------------------------| <------ X class object memory layout|        int X::x        |
stack |------------------------||   |       float X::xx      |                      |   |------------------------|      |-------|--------------------------||   |         X::_vptr       |------|       |       type_info X        |\|/  |------------------------|              |--------------------------||           o            |              |    address of X::~X()    ||           o            |              |--------------------------||           o            |              | address of X::printAll() ||                        |              |--------------------------||                        |
------|------------------------|------------|  static int X::count   |      /|\|------------------------|       ||           o            |  data segment           |           o            |       ||                        |      \|/
------|------------------------|------------|        X::X()          | |------------------------|       |   |        X::~X()         |       ||------------------------|       | |      X::printAll()     |      \|/ |------------------------|  text segment|      X::printInt()     ||------------------------||     X::printFloat()    ||------------------------|| static X::printCount() ||------------------------||                        |

(3)继承对象的内存布局

class X {int     x;string str;public:X() {}virtual ~X() {}virtual void printAll() {}
};class Y : public X {int     y;public:Y() {}~Y() {}void printAll() {}
};
      |                              |          |------------------------------| <------ Y class object memory layout|          int X::x            |
stack |------------------------------||   |              int string::len ||   |string X::str ----------------||   |            char* string::str |         \|/  |------------------------------|      |-------|--------------------------||           X::_vptr           |------|       |       type_info Y        ||------------------------------|              |--------------------------||          int Y::y            |              |    address of Y::~Y()    ||------------------------------|              |--------------------------||               o              |              | address of Y::printAll() ||               o              |              |--------------------------||               o              |              
------|------------------------------|--------|           X::X()             | |------------------------------|       |   |           X::~X()            |       ||------------------------------|       | |         X::printAll()        |      \|/ |------------------------------|  text segment|           Y::Y()             ||------------------------------||           Y::~Y()            ||------------------------------||         Y::printAll()        ||------------------------------||      string::string()        ||------------------------------||      string::~string()       ||------------------------------||      string::length()        ||------------------------------||               o              ||               o              ||               o              ||                              |

(4) 具有多重继承和虚拟功能的对象的内存布局

class X {
public:int     x;virtual ~X() {}virtual void printX() {}
};class Y {
public:int     y;virtual ~Y() {}virtual void printY() {}
};class Z : public X, public Y {
public:int     z;~Z() {}void printX() {}void printY() {}void printZ() {}
};
      |                              |          |------------------------------| <------ Z class object memory layout
stack |          int X::x            |         |   |------------------------------|                  |--------------------------|      |   |          X:: _vptr           |----------------->|       type_info Z        ||   |------------------------------|                  |--------------------------|\|/  |          int Y::y            |                  |    address of Z::~Z()    ||------------------------------|                  |--------------------------||          Y:: _vptr           |------|           |   address of Z::printX() ||------------------------------|      |           |--------------------------||          int Z::z            |      |           |--------GUARD_AREA--------|    |------------------------------|      |           |--------------------------||              o               |      |---------->|       type_info Z        ||              o               |                  |--------------------------||              o               |                  |    address of Z::~Z()    ||                              |                  |--------------------------|
------|------------------------------|---------         |   address of Z::printY() ||           X::~X()            |       |          |--------------------------|  |------------------------------|       |          |          X::printX()         |       |        |------------------------------|       |         |           Y::~Y()            |      \|/        |------------------------------|  text segment|          Y::printY()         |                |------------------------------|                |           Z::~Z()            |                |------------------------------|                |          Z::printX()         |                |------------------------------|                |          Z::printY()         |                |------------------------------|                |          Z::printZ()         |                |------------------------------|                |               o              |                |               o              |                |                              |  

原文链接:c++对象内存布局

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt使用绿色pdf阅读器打开文件
  • java spring定时任务-动态任务
  • 认知杂谈59《实力为王:用硬本事赢得尊重,开启人生逆袭路》
  • Python3中函数的用法
  • linux-用户与权限管理-组管理
  • 防患于未然,智能监控新视角:EasyCVR视频平台在高校安全防控中的关键角色
  • 一维稳态与非稳态导热的详细分析
  • 通信工程学习:什么是IP-CAN(IP连接接入网)
  • ETL_场景练习
  • 建投数据通过ISO9001再认证
  • [Postman]接口自动化测试入门
  • 探索Promise:JavaScript异步编程的基石
  • 组件通信——provide 和 inject 实现爷孙组件通信
  • 机器学习和深度学习的区别是什么?
  • 【WPF】Border的使用
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 30秒的PHP代码片段(1)数组 - Array
  • Hibernate最全面试题
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JS笔记四:作用域、变量(函数)提升
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • laravel with 查询列表限制条数
  • mysql innodb 索引使用指南
  • Shell编程
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从0到1:PostCSS 插件开发最佳实践
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 和 || 运算
  • 你真的知道 == 和 equals 的区别吗?
  • 排序(1):冒泡排序
  • 前端之React实战:创建跨平台的项目架构
  • 如何合理的规划jvm性能调优
  • 通过git安装npm私有模块
  • Linux权限管理(week1_day5)--技术流ken
  • puppet连载22:define用法
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​低代码平台的核心价值与优势
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #define、const、typedef的差别
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (06)金属布线——为半导体注入生命的连接
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (function(){})()的分步解析
  • (Java数据结构)ArrayList
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)pulsar安装在独立的docker中,python测试
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十)Flink Table API 和 SQL 基本概念
  • (四)模仿学习-完成后台管理页面查询
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战