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

虚函数指针和虚函数表的创建时机和存放位置

问题

虚函数指针和虚函数表的创建时机和存放位置

我的回答

虚函数表(vtable)是存放在程序的只读数据段(.rodata)中的。这是因为虚函数表是编译时就确定的,对于每个包含虚函数的类,编译器都会创建一个对应的虚函数表,其中存储了该类的虚函数地址。将它放在只读数据段可以防止程序意外修改这些函数指针,提高安全性。

而虚函数指针(vptr)是存放在对象的内存布局中的,通常位于对象的开头位置。当我们创建一个包含虚函数的类的对象时,这个对象会包含一个指向对应虚函数表的指针。由于对象可能在栈上创建,也可能在堆上创建,所以虚函数指针的具体存储区域取决于对象本身的分配位置:

  • 如果对象是栈上的局部变量,那么vptr就在栈内存中
  • 如果对象是通过new动态分配的,那么vptr就在堆内存中
  • 如果对象是全局或静态的,那么vptr就在数据段中

关于创建时机:

虚函数表是在编译期就创建好的,当编译器编译一个包含虚函数的类时,就会为这个类生成一个虚函数表。

而虚函数指针是在对象构造时被初始化的,具体来说是在执行基类构造函数之前,编译器会自动插入代码来初始化vptr,让它指向正确的虚函数表。这个初始化发生在任何用户代码执行之前。

在继承场景中,情况会更复杂一些。当派生类对象构造时,vptr最初会指向基类的虚函数表,然后在执行派生类构造函数时,vptr会被更新为指向派生类的虚函数表。这就是为什么在基类构造函数中调用虚函数时,会调用到基类的实现而不是派生类的实现,因为此时vptr还指向基类的虚函数表。

http://www.xdnf.cn/news/1382347.html

相关文章:

  • 【Linux知识】Linux 设置账号密码永不过期
  • 完整代码注释:实现 Qt 的 TCP 客户端,实现和服务器通信
  • 【LINUX网络】TCP原理
  • WEEX唯客上线C2C交易平台:打造安全便捷的用户交易体验
  • 现在购买PCIe 5.0 SSD是否是最好的时机?
  • 前端实现Linux查询平台:打造高效运维工作流
  • [光学原理与应用-320]:光学产品不同阶段使用的工具软件、对应的输出文件
  • 华为S5720S重置密码
  • c语言动态数组扩容
  • MCU平台化实践方案
  • STL库——list(类函数学习)
  • 财务数据报销画像技术实现:从数据采集到智能决策的全流程解析
  • 【AI自动化】VSCode+Playwright+codegen+nodejs自动化脚本生成
  • 当new一块内存时,操作系统做了哪些事情
  • 软考 系统架构设计师系列知识点之杂项集萃(134)
  • leetcode算法刷题的第二十天
  • 鸿蒙OS与Rust整合开发流程
  • 面试tips--JVM(3)--类加载过程
  • 动态加载和异步调用tasklet/workqueue day63 ay64
  • 中国剩余定理(以及扩展..)
  • .Net Core Web 架构(管道机制)的底层实现
  • [光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件
  • 【黑客技术零基础入门】2025最新黑客工具软件大全,零基础入门到精通,收藏这篇就够了!
  • JAVA全栈Redis篇————List常用命令讲解
  • 【架构师干货】软件工程
  • Linux学习-TCP并发服务器构建(epoll)
  • Cesium 入门教程(十一):Camera相机功能展示
  • Burp系列【密码暴力破解+令牌token破解】
  • 深度学习篇---VGGNet网络结构
  • DeepInteraction++基于多模态交互的自动驾驶感知与规划框架