从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并不需要有很完整的汇编知识,但必须了解起码的概念。
下面我们看看引入虚继承后的影响。为了有所对比我们首先看看普通成员函数的调用情况。
执行如下代码,它包括了对象的普通成员函数调用,类的静态成员函数调用、通过指针调用普通成员函数:
|
结果如下:
|
这是obj对象的内存地址。
首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为:
|
跟踪进去我们要以看到是一条跳转指令,继续执行可以看到真正的函数代码部分,如下(注:为了讨论方便我在第行前面加了一个行号):
|
再看看静态成员函数调用的汇编代码:
|
非常直接,因为它不需要处理this指针,跟踪到函数的汇编代码,可以看到同样不需要处理this指针。
具体的代码这里就不列出来了。
再看看通过指针调用普通成员函数pt-> foo();,产生的汇编代码如下:
|
和通过对象调用普通成员函数的代码差不多。不过存对象地址到ecx寄存器地,是通过解引用pt指针来找到对象地址的。
相关视频
相关阅读 c++ vector用法详解 c++ vector用法总结MicrosoftVisualC++运行库运行时错误解决方案十类C++标准库简介C++多线程系统编程技巧c++中new和delete的使用方法C++生成随机数—生成任意范围内的等概率随机数方法C++和java多态的区别VC++2008中如何调用GetOpenFileName打开文件的对话框函数?
热门文章 没有查询到任何记录。
最新文章
什么是.NET中的TDD?ASP.NET AJAX入门简介
WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用
人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题
查看所有0条评论>>