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

虚函数表存储的位置(解析C++内存分配及其编译分段)

先上结论:C++虚函数表保存在.rdata只读数据段。编译时期由编译器确定虚函数表。虚函数表属于类,类的所有对象共享这个类的虚函数表。
在这里插入图片描述

c/c++的内存分配

  1. 栈(stack):又称堆栈,栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等(但不包括static声明的变量,static意味着在数据段中存放变量)。除此之外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进后出的特点,所以栈特别方便用来保存/恢复调用数据。其操作方式类似于数据结构中的栈。
  2. 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小,并不固定,可动态扩张或缩放。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被提出(堆被缩减)。堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
  3. 全局数据区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。
    文字常量区:常量字符串就是放在这里,程序结束后由系统释放。
  4. 程序代码区:存放函数体的二进制代码

C语言在编译和连接后,将分成代码段(Text)、只读数据段(ROData)和读写数据段(RWData)。在运行时,除了以上三个区域外,还包括未初始化数据段(BSS)区域和堆(Heap)区域和栈(Stack)区域。

  1. .bss BSS段(bss segment):通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。
  2. .RW data数据段(data segment):通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
  3. .RO data只读数据段:只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。
  4. .text代码段(code segment/text segment):通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行之前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。程序段为程序代码在内存中的映射,一个程序可以在内存中有多个副本。
    在这里插入图片描述
http://www.lryc.cn/news/163126.html

相关文章:

  • JS如何正确销毁 VIDEO 和AUDIO 元素
  • SpringMvc第四战-【SpringMvc文件上传,下载】
  • 一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利四)
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:301-320)
  • dll文件反编译源代码 C#反编译 dotpeek反编译dll文件后export
  • 地图结构 | 图解占据栅格地图原理(附Matlab建图实验)
  • element-plus点击菜单栏全部展开问题解决
  • React 简便获取经纬度
  • 【多线程】线程安全的单例模式
  • Competitive Collaboration 论文阅读
  • 非科班菜鸡算法学习记录 | 代码随想录算法训练营完结!
  • C语言实现三字棋
  • 【LeetCode】35.复杂链表的复制
  • 代码大全阅读随笔(五)
  • No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集代码 下载)
  • 有什么好用的电容笔?apple pencil替代品推荐
  • 什么是回调函数?写出一个示例?
  • 深度学习在医疗保健领域的应用:从图像识别到疾病预测
  • SpringBoot实现自定义environment中的value加密
  • celery的用法--任务调度
  • MyBatis-Plus学习笔记总结
  • How Language Model Hallucinations Can Snowball
  • autojs修改顶部标题栏颜色
  • arppy gis 读取text 并批量添加字段 arcpy.AddField_management
  • Pandas中at、iat函数详解
  • 【Spring Boot】JPA — JPA入门
  • c#反射(Reflection)
  • Lua 元表和元方法
  • 【Git】01-Git基础
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initState)