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

从汇编角度揭秘C++构造函数(1)

C++的构造函数一直比较神秘,今天我们通过汇编的角度来揭秘一下,它的本质是什么。与常规函数有什么不同。从以下这段代码说起:

class Person
{
public:Person(int age) { _age = age; }void printAge(){ printf("age = %d\r\n",_age); }
private:int _age;
};int main()
{Person tom(20);return 1;
}

如上所示,定义了一个Person类,以及声明了一个构造函数(带一个int型变量)。在main函数中声明了一个tom的对象。我们查看上面代码对应的汇编:

Person::Person(int) [base object constructor]:push    rbpmov     rbp, rspmov     QWORD PTR [rbp-8], rdimov     DWORD PTR [rbp-12], esimov     rax, QWORD PTR [rbp-8]mov     edx, DWORD PTR [rbp-12]mov     DWORD PTR [rax], edxnoppop     rbpret
main:push    rbpmov     rbp, rspsub     rsp, 16lea     rax, [rbp-4]mov     esi, 20mov     rdi, raxcall    Person::Person(int) [complete object constructor]mov     eax, 1leaveret

重点关注main函数的汇编,通过指令“call    Person::Person(int) [complete object constructor]”,我们知道是在调用Person类的构造函数。我们再注意一下这条指令:“mov     esi, 20”,即将20写入esi这个寄存器中,根据之前的文章:从汇编的角度揭开C++ this指针的神秘面纱,我们知道这是在准备Person构造函数的形参,但是跟据函数传参约定:

esi(即RSI的低32位),传递的是第二个参数,RDI传递的是第一个参数。上面汇编代码中,Person类的构造函数明明只有一个形参,为什么需要传递两个实参呢?答案是Person类的构造函数还有一个隐含的参数,根据之前文章从汇编的角度揭开C++ this指针的神秘面纱,这个参数就是this指针!从而我们可以得出一个结论:类的构造函数与普通函数并本质区别,只不过编译器会'偷偷地'添加一个this指针作为第一个参数。

<构造函数揭秘继续...>

http://www.dtcms.com/a/316637.html

相关文章:

  • 数据安全——解读大数据安全架构设计方案【附全文阅读】
  • 力扣-283.移动零
  • Claude Code实战体验:AI智能编程助手如何重塑开发工作流?
  • MyBatis-Plus主键回填详解:插入数据后自动获取主键值
  • WSN - Wirth syntax notation 沃斯语法符号
  • 模板的进阶
  • JAVA,ThreadLocal
  • 浮动路由和BFD配置
  • 瀑布模型与敏捷开发的选择分析
  • 如何在nuxt项目中使用scss
  • 数据库SQL高阶操作1——Mysql8转换DM8相关sql语法写法优化调整,包括递归,函数,以及方言等特殊操作的改造支持
  • vue2 vue3 区别
  • PostGIS面试题及详细答案120道之 (101-110 )
  • 解决微信小程序中camera组件被view事件穿透触发对焦以及camera的bindtap事件
  • 猜数字游戏 Java
  • 并发编程的三要素是什么
  • Docker Desktop
  • 实战项目3-工控软件-2.0- 自定义控件HMILabel的创建
  • 用 Spark 找出最大值:高性能计算的正确姿势
  • 线性筛和os数组(牛客多校25年#7-G)
  • (ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗
  • web_socket_channel 后台重连机制失败
  • Kafka 的基本操作(1)
  • Web存储技术详解:sessionStorage、localStorage与Cookie
  • MySQL 深分页优化方案
  • Matplotlib(六)- 坐标轴定制
  • 【motion】HumanML3D 的安装1:环境搭建
  • 制造业ERP系统架构设计方案(基于C#生态)
  • [激光原理与应用-151]:光学器件 - 光学平晶:高精度平面度检测的核心工具
  • 用phpstudy安装php8.2后报错:意思是找不到php_redis.dll拓展时