从汇编的角度理解c++

从汇编的角度理解c++

ID:18128891

大小:228.50 KB

页数:8页

时间:2018-09-14

从汇编的角度理解c++_第1页
从汇编的角度理解c++_第2页
从汇编的角度理解c++_第3页
从汇编的角度理解c++_第4页
从汇编的角度理解c++_第5页
资源描述:

《从汇编的角度理解c++》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、从汇编的角度理解C++(一)2007-11-2614:32362人阅读评论(0)收藏举报汇编c++initializationclassstringiostreamC的优美在于其清澈,一眼见底,看着C代码甚至可以想像到其构成的汇编,而C++的优美在于其优雅,结合面向对象和泛型的方法,可以写出赏心悦目的代码。对于既喜欢优雅又喜欢清澈的人来说(比如我),只好阅读C++生成的汇编代码来理解C++了。下面就将从几个侧面,来看看VC8.0是怎么实现C++的众多技术的吧。(顺便汇总我在C++/C版面上回答此类问题所发表的文

2、章)今天要写的是this指针,虚函数和构造函数初始化的顺序(1)this指针 总是将this指针leaecx,[this],然后再调用成员函数。就是thiscall的函数调用方式。 例程:#include using namespace std;class Base ...{protected: int val;public: int GetVal() ...{   return val; }};int main()...{ Base test; test.GetVal(); return 

3、0;} 相应的汇编指令:test.GetVal();lea         ecx,[test] call        Base::GetVal (42BFCDh)   (2)虚函数的实现。对于单继承的类,虚函数表的指针存放在类的开始4个字节,访问虚函数的时候,就是首先取得虚函数表的头指针,然后加一个偏移的量(此偏移量的计算是根据声明虚函数的顺序来定的,也就是说第一个声明的虚函数,偏移量就是0,以此类推),取得函数指针,再进行访问。虚函数损失的效率就是在于比普通函数多了两次访问内存的过程。例程:class B

4、ase ...{protected: int val; int val2;public: virtual int GetVal() ...{      return val; } virtual int GetVal2() ...{      return val2; }};class Child:public Base...{public: virtual int GetVal2() ...{  return 0; }};int main()...{ Child test; Base *p=(Base*)&t

5、est; p->GetVal2(); return 0;} 生成的汇编p->GetVal2();mov         edx,dword ptr[p]mov         ecx,dword ptr [p] mov         eax,dword ptr [edx+4] call          eax   对于多继承的类,则稍稍复杂了点。比如从BaseA,BaseB继承而来类,其头四个字节存放跟BaseA相关的虚函数表头指针,接下来存放BaseA的成员变量,再接下来的四个字节,存放BaseB相关的虚

6、函数头指针,接下去是BaseB的成员变量。这样一来造成指向对象自己的BaseB*的基类指针实际指向的是对象地址+sizeof(BaseA),因此如果delete该指针就会出错。例程#include using namespace std;class Base...{protected: int val; int val2;public: virtual int GetVal() ...{      return val; } virtual int GetVal2() ...{      r

7、eturn val2; }};class Base2...{protected: int val;public: virtual int GetVal() ...{  return val; }};class Child:public Base, Base2...{public: virtual int GetVal2() ...{  return 0; }};int main()...{ Child *test= new Child; Base *p=(Base*)test; Base2 *p2 =(Base

8、2*)test;//指向test+sizeof(Base) cout<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。