首页 > 编程语言 >用汇编的眼光看C++(之class构造、析构)

用汇编的眼光看C++(之class构造、析构)

时间:2022-11-23 11:01:57浏览次数:41  
标签:apple 函数 C++ ebp 析构 构造函数 class ecx


    前面我们讨论基本上都是C语言的内容,还没有真正触及到C++的相关知识。从这篇博客之后,我们将会更多触及类的内容。类的属性很多,今天我们讨论主要就是构造函数、析构函数。

    

    (1)如果没有构造函数、析构函数呢?

class apple
{
public:
void print() const {return;}
};

    虽然这个类没有什么意义,但是如果用sizeof计算一下大小的话,我们发现它还是占了一个字节。那么如果有一个apple的变量呢?为了让apple的变量有意义,我们尝试做一个改变:

66:       apple a;
67: a.print();
00401248 lea ecx,[ebp-4]
0040124B call @ILT+0(apple::print) (00401005)
68: return;
69: }

    我们看到,堆栈分配了四个字节空间给a,就是ebp下面的一个字节。


    (2) 析构函数什么时候调用?

class apple
{
public:
apple() {printf("apple()!\n");}
~apple() {printf("~apple()!\n");}
void print() const {return;}
};

    如果调用呢,我们可以做一个测试环境,如下所示:

68:       apple a;
0040126D lea ecx,[ebp-10h]
00401270 call @ILT+65(apple::apple) (00401046)
00401275 mov dword ptr [ebp-4],0
69: {
70: apple b;
0040127C lea ecx,[b]
0040127F call @ILT+65(apple::apple) (00401046)
71: }
00401284 lea ecx,[b]
00401287 call @ILT+0(apple::~apple) (00401005)
0040128C mov dword ptr [ebp-4],0FFFFFFFFh
72: }
00401293 lea ecx,[ebp-10h]
00401296 call @ILT+0(apple::~apple) (00401005)
0040129B mov ecx,dword ptr [ebp-0Ch]
0040129E mov dword ptr fs:[0],ecx

    我们看到,只要出了作用域,析构函数就会自动会被调用。


    (3)如果是new调用类,析构函数会自动调用吗?

    不会。


    (4)构造函数、析构函数的本质?

    我们知道在函数中的临时变量在堆栈里面应用的时候都需要初始化处理的,在堆栈返回的时候会被自动收回。那么构造函数和析构函数?其实是一样的,在函数调用的时候,堆栈也会为这样一个类准备大小合适的堆栈,然后调用构造函数对这样的一片内存进行初始化处理,在函数return的时候,调用另外一个函数对可能涉及到的资源进行一次清理。这里指的资源不是指内存空间,而是指广义意义上的系统资源、比如说IO、socket、锁、画笔、对话框句柄等等。所以,通常而言,如果你在析构函数里面没有及时对资源进行分配,那么就会造成资源的泄露。这一切只有等到程序结束的时候才会重新回到系统的手中,不过如果一个程序占有太多的资源,那么势必会对别的程序造成影响。


【待续】

标签:apple,函数,C++,ebp,析构,构造函数,class,ecx
From: https://blog.51cto.com/u_15888909/5880572

相关文章

  • 用汇编的眼光看C++(之算术符重载)
       算术符重载是类的有一个特性,但是每个人使用的方法不一样。用的好,则事半功倍;但是如果不正确的使用,则会后患无穷。   (1)简单算术符介绍   那什么是算术符重载......
  • 用汇编的眼光看C++(之虚函数)
       虚函数是面向对象设计中的一个重要内容。它的出现使得我们只需要相同的接口函数,并可以得到不同的生成结果。但是有些朋友却知其然,不知其所以然,为什么会出现这样的结......
  • 用汇编的眼光看C++(之类继承)
       继承是类的一个基本属性,可是在类的继承过程中,函数是怎么初始化?怎么析构的呢?我们不妨看看下面这样的一段代码?classemployee{public:employee(){printf("employee......
  • 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......