首页 > 编程语言 >用汇编的眼光看C++(之类继承)

用汇编的眼光看C++(之类继承)

时间:2022-11-23 11:00:32浏览次数:34  
标签:汇编 mov C++ push manager ebp pop employee 眼光



    继承是类的一个基本属性,可是在类的继承过程中,函数是怎么初始化?怎么析构的呢?我们不妨看看下面这样的一段代码?

class employee
{
public:
employee() { printf("employee()!\n");}
~employee() { printf("~employee()!\n");}
};

class manager : public employee
{
public:
manager() { printf("manager()!\n");}
~manager() { printf("~maneger()!\n");}
};

    看到上面的代码,相信大家也明白了,我们定义了这样一个类。基类是empoyee,继承类是manager。我们看到manager是一种特殊的employee,那么在内存构建和析构的时候函数又是怎么安排的呢?

74:       manager m;
00401268 lea ecx,[ebp-4]
0040126B call @ILT+60(manager::manager) (00401041)
75: }
00401270 lea ecx,[ebp-4]
00401273 call @ILT+0(manager::~manager) (00401005)
00401278 pop edi
00401279 pop esi
0040127A pop ebx
0040127B add esp,44h
0040127E cmp ebp,esp
00401280 call __chkesp (00408760)
00401285 mov esp,ebp
00401287 pop ebp

    我们发现manager的构造和析构其实也简单。构造函数其实就是在变量出现的时候进行构造。那什么时候析构呢?也就在函数快结束的时候进行析构。下面我们可以进一步讨论在manager的构造和析构究竟是怎么做的?

65:   class manager : public employee
66: {
67: public:
68: manager() { printf("manager()!\n");}
004012A0 push ebp
004012A1 mov ebp,esp
004012A3 sub esp,44h
004012A6 push ebx
004012A7 push esi
004012A8 push edi
004012A9 push ecx
004012AA lea edi,[ebp-44h]
004012AD mov ecx,11h
004012B2 mov eax,0CCCCCCCCh
004012B7 rep stos dword ptr [edi]
004012B9 pop ecx
004012BA mov dword ptr [ebp-4],ecx
004012BD mov ecx,dword ptr [ebp-4]
004012C0 call @ILT+40(employee::employee) (0040102d)
004012C5 push offset string "manager()!\n" (00431020)
004012CA call printf (004086e0)
004012CF add esp,4
004012D2 mov eax,dword ptr [ebp-4]
004012D5 pop edi
004012D6 pop esi
004012D7 pop ebx
004012D8 add esp,44h
004012DB cmp ebp,esp
004012DD call __chkesp (00408760)
004012E2 mov esp,ebp
004012E4 pop ebp
004012E5 ret

    我们发现,manager的构造里面添加了employee的缺省构造函数,那么析构函数呢?

69:       ~manager() {  printf("~maneger()!\n");}
00401350 push ebp
00401351 mov ebp,esp
00401353 sub esp,44h
00401356 push ebx
00401357 push esi
00401358 push edi
00401359 push ecx
0040135A lea edi,[ebp-44h]
0040135D mov ecx,11h
00401362 mov eax,0CCCCCCCCh
00401367 rep stos dword ptr [edi]
00401369 pop ecx
0040136A mov dword ptr [ebp-4],ecx
0040136D push offset string "~maneger()!\n" (00431040)
00401372 call printf (004086e0)
00401377 add esp,4
0040137A mov ecx,dword ptr [ebp-4]
0040137D call @ILT+5(employee::~employee) (0040100a)
00401382 pop edi
00401383 pop esi
00401384 pop ebx
00401385 add esp,44h
00401388 cmp ebp,esp
0040138A call __chkesp (00408760)
0040138F mov esp,ebp
00401391 pop ebp
00401392 ret

    我们发现,manager构造的时候employee率先构造,然后打印manager;析构的时候,恰恰相反,manager首先析构自己,然后在再调用employee的析构函数,上面的汇编代码证明了一切。



标签:汇编,mov,C++,push,manager,ebp,pop,employee,眼光
From: https://blog.51cto.com/u_15888909/5880577

相关文章

  • C/C++模拟校园卡
    C/C++模拟校园卡模拟校园卡出题人:俞琼面向专业:物联网工程难度等级:41问题描述同学们都在机房做实验或自由上机,请根据自己实际使用情况编写一份模拟校园卡消费记录查......
  • C++学校图书馆管理系统
    C++学校图书馆管理系统一、实验目的1.掌握结构体类型的声明方法;2.掌握结构体变量、结构体数组、结构体指针的定义和初始化的方法;3.掌握向函数传递结构体变量、结构体数......
  • c++ 调用 python 2.7
    本来想调用python3.10的,但一直安装不成功,先记录一下python2.7。先上代码:#include<iostream>usingnamespacestd;#include"Python.h"intmain(intargc,cha......
  • P1644 跳马问题 C++ 搜索回溯+dfs
    题目背景在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……题目描述中国象棋半张棋盘如图1所示。马自左下角(0,0)向右上角(m,n)跳。规定只能往......
  • P2819 图的m着色问题 C++ 详细题解
    题目背景给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图......
  • [C++]二进制求子集
    这几天做[leetcode1178]猜字谜的题目,用到了很多小的知识技巧点。其中一个就是二进制状态压缩以及如何根据一个二进制序列求其子集,如二进制序列110111001子集里有000000001......
  • Dev-C++5.11安装教程
    (目录)一、下载1.介绍原公司Bloodshed已经停止开发Dev-C++了,但是Embarcadero开发着一个Dev-C++的分支。详见:https://www.embarcadero.com/cn/free-tools/dev-c......
  • 如何利用C++使Windows蓝屏
    如何利用C++使Windows蓝屏虽说windows非常强大,但是使它蓝屏也非常简单:如果你想让Windows蓝屏,你一定会在运行框里输入:cmd/cfor/f%Iin('wmicprocessgetName')d......
  • C/C++个人帐本管理系统
    C/C++个人帐本管理系统程序设计题3:个人帐本管理系统指导老师:吴家皋[email protected]【问题描述】该系统要求实现一个简单、实用的个人帐本管理程......
  • C/C++飞机票订购系统
    C/C++飞机票订购系统程序设计题5:飞机票订购系统指导老师:吴家皋[email protected]【问题描述】该系统要求实现一个简单、实用的机票订购程序,主要功......