2
回答
莫邪内联汇编之C++成员函数__5
科大讯飞通用文字识别100000次/天免费使用。立即申请   

        C++在函数方面,支持重载的概念。所以在处理函数的时候,会额外执行“函数识别”这一步。请看显示代码

 

#include <iostream>


class A
{
public:
	void say(){printf("say()");}
	void say(int){/*std::cout<<"say(int)";*/}
	int  say(double){;return 0;}
	void none(){;}
	void none(int){;}
};

int main()
{
  A a;
  a.none();
  a.say(1);
  a.say();
  a.say(1.0);
  
  return 0;
}


 

程序中, 便于观察。我把用到模板的部分先注释掉。反汇编结果如下

 

 

我们发现 在函数调用的部分 出现了 @ILT 这是什么呢? 也行我们应该去看看 内容是什么? 鼠标选中右边的地址 如00401023 然后左击拖住往下拉,你会看到一个加号箭头

于是我们来到了@ILT 部分

 

我们看到 从 0-30 都是 jmp 指令。相当于 我们在调用成员函数的时候, 会先来到这张“跳转表”来执行相应的函数。我们发现指令大小是5个字节,所以也都是+5的增量。

但是 注意@ILT+15 我们发现我们并没有调用相关函数?这是为什么呢? 你也许会想到我们函数的参数里 可能涉及类型识别的东西,所以才会出现吧。 注意,这张表里竟然还有 main 函数 呵呵。 这下 对于C++成员函数的调用 应该很明白了, 我刚开始为什么要注释掉模板iostream呢? 因为加上去后,会有很多诸如+15 这样的函数,怪不得

一直听别人谈论C++的时候,会说 C++背地里会有很多小动作,我们还是来看看它的小动作吧。

 

 

看到这里 是不是觉得C++的 预备动作真多啊~。 成员函数就这样,内容不多。碍于个人能力,不做进一步的分析。(你要知道,小动作还有很多。)

:)

 


原文链接:http://blog.csdn.net/template_cplus/article/details/7895678
举报
晨曦之光
发帖于6年前 2回/987阅
顶部