我有以下代码:
class Base {
public:
int x,y;
Base() { x=10; y=20; }
virtual void myfunction() { }
};
int main() {
Base *b = new Base();
return 0;
}
反汇编给我这样的东西:
push 0Ch ; size of Base
call j_<some giberrish> ; IDA gives the comment "operator new(uint)"
add esp, 4 ; function epilogue
mov [ebp+var_E0], eax
几行之后,您将调用构造函数。
mov ecx, [ebp+var_E0]
call j_Base__Base
mov [ebp+var_F4], eax
- 起初我以为
var_E0
会包含指向实例的指针,但现在我很确定var_F4
会包含实例的返回值构造函数。 - 在那种情况下,
var_E0
到底包含什么?为什么在调用构造函数之前就移到ecx
中了?
最佳答案
它是编译器临时生成的一些内部变量。
当你编写new Base
时,编译器生成一个对全局的调用
operator new
函数,然后调用返回的构造函数
地址。显然,您的编译器保存了从
operator new
在内存中,而不是将其保存在寄存器中。
关于C++类反汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436776/