通过这个例子,理解网上的一句话,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
网友评论