New的VC编译器实现

2024-09-07 17:08
文章标签 实现 编译器 new vc

本文主要是介绍New的VC编译器实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。

 

(在 vc debug模式下 )

double *p1 = new double ;

00411A6E  push        8   

00411A70  call        operator new (4111B8h)

00411A75  add         esp,4

00411A78  mov         dword ptr [ebp-104h],eax

00411A7E  mov         eax,dword ptr [ebp-104h]

00411A84  mov         dword ptr [p1],eax

 

double *p2 = new double (3.0);

00411A87  push        8   

00411A89  call        operator new (4111B8h)

00411A8E  add         esp,4

00411A91  mov         dword ptr [ebp-0F8h],eax

00411A97  cmp         dword ptr [ebp-0F8h],0

00411A9E  je          memory_func5+6Ch (411ABCh)

00411AA0  mov         eax,dword ptr [ebp-0F8h]

00411AA6  fld         qword ptr [__real@4008000000000000 (416650h)]

00411AAC  fstp         qword ptr [eax]

00411AAE  mov         ecx,dword ptr [ebp-0F8h]

00411AB4  mov         dword ptr [ebp-10Ch],ecx

00411ABA  jmp         memory_func5+76h (411AC6h)

00411ABC  mov         dword ptr [ebp-10Ch],0

00411AC6  mov         edx,dword ptr [ebp-10Ch]

00411ACC  mov         dword ptr [p2],edx

 

class AClass1

{

};

 

AClass1 *pC1 = new AClass1;

00413D3E  push        1   

00413D40  call        operator new (4111B8h)

00413D45  add         esp,4

00413D48  mov         dword ptr [ebp-11Ch],eax

00413D4E  mov         eax,dword ptr [ebp-11Ch]

00413D54  mov         dword ptr [ebp-2Ch],eax

 

class AClass2

{

public :

      AClass2(){}

};

 

AClass2 *pC2 = new AClass2;

00413D57  push        1   

00413D59  call        operator new (4111B8h)

00413D5E  add         esp,4

00413D61  mov         dword ptr [ebp-104h],eax

00413D67  mov         dword ptr [ebp-4],0

00413D6E  cmp         dword ptr [ebp-104h],0

00413D75  je          memory_func5+0EAh (413D8Ah)

00413D77  mov         ecx,dword ptr [ebp-104h]

00413D7D  call        AClass::AClass (411212h)

00413D82  mov         dword ptr [ebp-13Ch],eax

00413D88  jmp         memory_func5+0F4h (413D94h)

00413D8A  mov         dword ptr [ebp-13Ch],0

00413D94  mov         eax,dword ptr [ebp-13Ch]

00413D9A  mov         dword ptr [ebp-110h],eax

00413DA0  mov         dword ptr [ebp-4],0FFFFFFFFh

00413DA7  mov         ecx,dword ptr [ebp-110h]

00413DAD  mov         dword ptr [ebp-38h],ecx

 

从上面 4个例子可以看到,在 new 操作符的背后,编译器做了两件事 :

  1. 计算 new后申请的数据的大小,然后调用函数 operator new开辟空间
  2. 调用相应得构造函数。

 

当然,在很多情况下,步骤 2都不需要,比如是基本数据类型,或类未写任何构造函数。

事实上,我们完全可以自己手工调用函数实现上面两个过程。

例如:

AClass2 *pC1 = new AClass2;

delete pC1;

AClass2 *pC2 = (AClass2*)operator new (sizeof (AClass2));

::new (pC2) AClass2;

 

pC2->~AClass2();

delete ((void *)pC2);

 

事实上, vector和 CArray内部需要扩大数组时都采用第二种方法,先申请数组所需的空间,然后对新元素在指定地方调用构造函数。

 

事实上,在 delete时也会有两个过程:

  1. 调用类的析构函数

调用 operator delete 函数释放内存

 

这篇关于New的VC编译器实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1145641

相关文章

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1