C010 obj; PRINT_OBJ_ADR(obj) obj.foo(); C012::sfoo(); C010 * pt = &obj; pt->foo(); |
结果如下:
obj's address is : 0012F843
这是obj对象的内存地址。
首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为:
00422E09 lea ecx,[ebp+FFFFF967h]
00422E0F call 0041E289
第1行把对象的地址存入ecx寄存器,执行完这行指令后,我们要以看到ecx中的值为0x0012F843,就是前面打印出的值。如果函数需要传递参数,我们还会在前面看到一些push指令。在第2行我们可以看到call的是一个直接的地址,这也就是静态绑定。即函数的调用地址在编译时已经被编译器决议。