C++中类成员函数的this指针解析

C++中类成员函数的this指针解析

代码:

//test.cpp

#include<iostream>
using namespace std;

class MYACLS {
public:
    int m_i;
    static int m_si; //声明
    int m_j;

    void myfunc() {
        m_i = 5;
        m_j = 6;
    }
};

int MYACLS::m_si = 10; //定义

int main()
{
    MYACLS myobj;
    MYACLS* pmyobj = new MYACLS();

    pmyobj->myfunc();

    return 0;
}

调试:

In file: /home/ubuntu/Dev/C++ObjectModern/data_semantics/test.cpp
   20 int main()
   21 {
   22     MYACLS myobj;
   23     MYACLS* pmyobj = new MYACLS();
   2425     pmyobj->myfunc();
   26
   27     return 0;
   28 }
   
=> 0x00005555555551b0 <+39>:	mov    rax,QWORD PTR [rbp-0x10]
   0x00005555555551b4 <+43>:	mov    rdi,rax
   0x00005555555551b7 <+46>:	call   0x55555555522a <MYACLS::myfunc()>

其中rdi寄存器中存的是类成员函数MYACLS::myfunc()的第一个参数,这也就是我们常说的this指针。它的值就是对象pmyobj的值。

我们来证明一下:

   0x5555555551b0 <main+39>                                                mov    rax, qword ptr [rbp - 0x10]
 ► 0x5555555551b4 <main+43>                                                mov    rdi, rax
 
 pwndbg> p pmyobj
$1 = (MYACLS *) 0x55555556aeb0
pwndbg> i r rax
rax            0x55555556aeb0      93824992325296
pwndbg>

我们看到寄存器rax保存的就是对象pmyobj的值,也就是我们常说的this指针。然后:

  0x5555555551b0 <main+39>                                                  mov    rax, qword ptr [rbp - 0x10]
  0x5555555551b4 <main+43>                                                  mov    rdi, rax
► 0x5555555551b7 <main+46>                                                  call   MYACLS::myfunc()                <MYACLS::myfunc()>
        rdi: 0x55555556aeb0 ◂— 0x0

pwndbg> i r rdi
rdi            0x55555556aeb0      93824992325296
pwndbg>

我们看到寄存器rax的值赋值给了rdi,也就是类成员函数MYACLS::myfunc()的第一个参数。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落后的炫幕あ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值