news 2026/7/14 15:41:53

虚函数的反汇编

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚函数的反汇编

虚函数的反汇编

虚函数机制

当类中有虚函数时,编译器会把类中所有虚函数的地址统一放在一张地址表中,这张表叫做虚函数地址表。同时编译器会在类中添加一个隐藏数据成员,称为虚表指针,该指针保存着虚函数表的首地址,用于记录和查找虚函数。

先来看一个简单的例子:

#include<stdio.h>classPerson{public:virtualintgetAge(){returnage;}virtualvoidsetAge(intage){this->age=age;}private:intage;};intmain(intargc,charconst*argv[]){Person person;return0;}

main函数的反汇编代码如下:

执行完构造函数之后,我们查看rcx中保存的地址所指向的内存地址:

我们反汇编00007ff7`ab3725c7和00007ff7`ab372b4e这两个地址:

可以发现,这就是两个虚函数的首地址,对象的地址就是虚函数表的首地址。

我们来看看默认构造函数里面做了什么:

默认构造函数把虚函数表的首地址赋值给了this指针(rcx),并返回之。

因为虚表信息在编译后会被链接到对应的执行文件中,所以获得的虚表地址是一个相对固定的地址。虚表中虚函数的地址排列顺序因虚函数在类中的声明顺序而定,先声明的虚函数的地址会被排列在虚表靠前的位置。第一个被声明的虚函数的地址在虚表的首地址处。

对于含有构造函数的类而言,其虚表初始化过程和默认构造函数相同,都是在对象首地址处保存虚表的首地址。

在析构函数中,对虚表指针进行的操作和构造函数是一样的。在析构函数中设置虚表指针,与构造函数中这样做,核心目的都是为了确保对象在其生命周期的不同阶段,能够通过正确的虚函数表来调用当前阶段所属类的虚函数,这是C++实现多态机制的基石。

析构是构造的逆过程,顺序是从派生类到基类。首先进入派生类的析构函数,此时对象仍然是一个完整的“派生类对象”,因此需要先执行派生类的析构函数体来清理派生类特有的资源。在派生类的析构函数体执行完毕后,编译器会自动插入代码,将虚表指针还原为基类的虚函数表,然后再调用基类的析构函数。这样,当执行流程进入基类的析构函数时,对象已经被“部分销毁”,其身份退回到了“基类对象”,虚表指针也必须与之匹配。

虚函数的调用

先看代码:

#include<stdio.h>classPerson{public:virtualintgetAge(){returnage;}virtualvoidsetAge(intage){this->age=age;}private:intage;};intmain(intargc,charconst*argv[]){Person person;person.getAge();return0;}

对于通过对象直接调用虚函数,是不需要查找虚函数表的,因为对象的类型在编译期就可以确定了,是静态绑定,没有多态的情况。

只有通过对象指针或者引用调用虚函数的时候,才需要查询虚表进行调用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 11:21:01

IDM激活脚本完整指南:永久解锁高速下载体验

IDM激活脚本完整指南&#xff1a;永久解锁高速下载体验 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager的30天试用期结束而困扰…

作者头像 李华
网站建设 2026/7/8 13:46:02

Fun-ASR实战:如何高效转写课程与访谈内容

Fun-ASR实战&#xff1a;如何高效转写课程与访谈内容 在教育、媒体、科研和企业服务等领域&#xff0c;大量的知识传递依赖于口头交流——无论是线上课程讲解、专家访谈对话&#xff0c;还是内部培训会议。这些音频内容蕴含着宝贵的信息&#xff0c;但若无法快速转化为可编辑、…

作者头像 李华
网站建设 2026/7/1 14:58:12

ADB Explorer:Windows平台最便捷的Android文件管理神器

ADB Explorer&#xff1a;Windows平台最便捷的Android文件管理神器 【免费下载链接】ADB-Explorer A fluent UI for ADB on Windows 项目地址: https://gitcode.com/gh_mirrors/ad/ADB-Explorer 还在为繁琐的ADB命令行操作而烦恼吗&#xff1f;&#x1f914; 每次想从手…

作者头像 李华
网站建设 2026/7/1 13:10:16

浏览器媒体资源捕获完全手册:从入门到精通

浏览器媒体资源捕获完全手册&#xff1a;从入门到精通 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今多媒体内容爆炸的时代&#xff0c;如何高效获取网络视频资源成为用户关注的焦点。猫抓资源…

作者头像 李华
网站建设 2026/7/13 17:46:08

万物识别-中文-通用领域垃圾分类系统:智能回收站部署实战

万物识别-中文-通用领域垃圾分类系统&#xff1a;智能回收站部署实战 你有没有想过&#xff0c;一个垃圾桶也能“看懂”你手里的垃圾是什么&#xff1f;不是科幻&#xff0c;而是现实。借助阿里开源的万物识别模型&#xff0c;我们今天要动手搭建一套中文通用领域的智能垃圾分…

作者头像 李华
网站建设 2026/7/8 22:56:23

YOLOv9训练性能评测:GPU利用率高达92%的部署优化技巧

YOLOv9训练性能评测&#xff1a;GPU利用率高达92%的部署优化技巧 你是否试过跑YOLOv9训练&#xff0c;看着GPU使用率在60%上下徘徊&#xff0c;显存却早已吃满&#xff1f;明明是A100或RTX 4090&#xff0c;却像被捆住手脚——数据加载慢、梯度同步卡顿、batch size不敢调高……

作者头像 李华