c++中的this指针的获取

2019-05-28  本文已影响0人  help_youself

 通过这个例子,理解网上的一句话,this并不是一个类,只是一个关键字。那么类中的函数是怎么样获取到this代表的类的地址呢?这个网上有说,一个实例在调用类中函数时,会将此实例的地址存进ecx寄存器中。
 测试代码

#include <iostream>

using namespace std;

class Base {
public:
    virtual void f() {
        register int ecx asm("ecx");
        printf("ecx %x\n",ecx);
        printf("addr %x\n",this);
        cout<<"base::f"<<endl;
        }
    virtual void g() {cout<<"base::g"<<endl;}
    virtual void h() {cout<<"base::h"<<endl;}
};

class Derive : public Base{
public:
    void g() {cout<<"derive::g"<<endl;}
};
int main() {

    typedef void(*Func)(void);
    Base *d = new Derive();
    d->f();
    printf("base %x\n",d);
    long* pvptr = (long*)d;
    long* vptr = (long*)*pvptr;
    Func f = (Func)vptr[0];
    Func g = (Func)vptr[1];
    Func h = (Func)vptr[2];
    register int ecx asm("ecx");
    printf("test ecx %x\n",ecx);
    f();
    g();
    h();

    return 0;
}

f();这个调用,就会使得f中打印出的地址是个莫名其妙的值。
 下面的当时获取寄存器ecx的值也可以。

class Test{
public:
    void Print(){
     int b=0;
     asm ( "movl %%ecx, %0;\n"
          : "=r" (b));
     printf("%x,%x\n",this,b);
    }
private:

};

[1] 深入分析C++虚函数表
[2] 最牛X的GCC 内联汇编https://www.linuxprobe.com/gcc-how-to.html "
[3] C调用汇编 https://chuanwang66.iteye.com/blog/1837556

上一篇 下一篇

猜你喜欢

热点阅读