iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何深度剖析C++资源管理细节
  • 117
分享到

如何深度剖析C++资源管理细节

2023-06-17 17:06:55 117人浏览 独家记忆
摘要

如何深度剖析c++资源管理细节,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们从系统结构的角度上讲,C/C++ 支持 3 种内存管理方式,基于栈的C++资源管

如何深度剖析c++资源管理细节,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

我们从系统结构的角度上讲,C/C++ 支持 3 种内存管理方式,基于栈的C++资源管理,基于堆的动态管理,和基于全局区的静态管理,仅供大家学习切磋。

C++资源管理两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RaiI。GC让程序建立在更高的抽象层次上,使资源管理变得更方便,更安全;而RAII则保留了C的底层能力,同时在C++特性的支持下提供了简单有效的资源管理方式。

我们知道C++最激烈的批评往往来自于C社区,而在我看来C程序员可以不接受虚函数,不接受模板,但有什么理由不接受RAII呢?可以说RAII是C++相对C来说几乎无副作用的明显进步。

下面就从GC开始:

C#通过CLR管理托管内存,用引用抽象代替指针间接操作托管内存,让程序员在更高的层次上安全地使用资源。这使得C#失去了直接管理内存的能力,但换来了以下好处:

类型安全:在C/C++中可以通过类型转换把整数或其他类型的指针转换为特定类型的指针,这意味着指针是非类型安全的,必须由程序员来保证指针代表的内存空间的合法性。而C#引用可以看作是类型安全的指针,as运算符可以保证转换的类型安全性。

内存整理:创建对象需要从堆中动态分配连续的内存空间,由于不同对象的内存大小是不同的,常见的***匹配和***匹配堆分配算法都会造成堆中的内存碎片问题。碎片的存在使实际可用内存小于物理内存,所以应尽量减少碎片的产生。

一个方向是设计更好的内存分配算法;另一个方向是通过周期性地进行内存整理调整优化。在C++资源管理中,由于指针代表了绝对地址,因此不存在通用的内存整理算法;而C#屏蔽了指针,通过引用操作对象,就使得内存整理成为可能。

PS:这并不意味着C/C++内存分配就弱于C#,C++资源管理可以为某种类型的对象设计专用的内存分配方式,甚至把对象指定分配到某一物理地址空间,这些都是C#不具备的。

托管和非托管资源

在C#中,资源分为托管资源和非托管资源两种。GC在回收无用对象资源时,可以自动回收托管资源(比如托管内存),但对于非托管资源(比如Socket、文件、数据库连接)必须在程序中显式释放。

托管资源的回收首先需要GC识别无用对象,然后回收其资源。一般无用对象是指通过当前的系统根对象和调用堆栈对象不可达的对象。对象有一个重要的特点导致无用对象判断的复杂性:对象间的相互引用!如果没有相互引用,就可以通过“引用计数”这种简单高效的方式实现无用对象的判断,并实现实时回收。

正是由于相互引用的存在导致GC需要设计更为复杂的算法,这样带来的***问题在于丧失了资源回收的实时性,而变成一种不确定的方式。对于非托管资源的释放,C#提供了两种方式:

Finalizer:写法貌似C++资源管理的析构函数,本质上却相差甚远。Finalizer是对象被GC回收之前调用的终结器,初衷是在这里释放非托管资源,但由于GC运行时机的不确定性,通常会导致非托管资源释放不及时。

另外,Finalizer可能还会有意想不到的副作用,比如:被回收的对象已经没有被其他可用对象所引用,但Finalizer内部却把它重新变成可用,这就破坏了GC垃圾收集过程的原子性,增大了GC开销。

Dispose Pattern:C#提供using关键字支持Dispose Pattern进行资源释放。这样能通过确定的方式释放非托管资源,而且using结构提供了异常安全性。所以,一般建议采用Dispose Pattern,并在Finalizer中辅以检查,如果忘记显式Dispose对象则在Finalizer中释放资源。

可以说,GC为程序带来安全方便的同时也付出了不小的代价:一则丧失了托管资源回收的实时性,这在实时系统和资源受限系统中是致命的;二则没有把托管资源和非托管资源的管理统一起来,造成概念割裂。

C++的定位之一是底层开发能力,所以不难理解GC并没有成为C++的语言特性。虽然我们在C++0x和各种第三方库都能看到GC的身影,但GC对于C++来讲并不是那么重要,至多是一个有益的补充。C++资源管理足以傲视C,并和C# GC一较高下的是它的RAII。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网其他教程频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何深度剖析C++资源管理细节

本文链接: https://www.lsjlt.com/news/290999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何深度剖析C++资源管理细节
    如何深度剖析C++资源管理细节,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们从系统结构的角度上讲,C/C++ 支持 3 种内存管理方式,基于栈的C++资源管...
    99+
    2023-06-17
  • 剖析CocosCreator新资源管理系统
    目录1.资源与构建1.1 creator资源文件基础1.2 资源构建2. 理解与使用 Asset Bundle2.1 创建Bundle2.2 使用Bundle3. 新资源框架剖析3....
    99+
    2024-04-02
  • MyBatis源码剖析之Mapper代理方式细节
    MyBatis是一个流行的Java持久层框架,它提供了多种方式来执行数据库操作,其中之一就是通过Mapper代理方式。通过Mapper代理方式,开发者可以编写接口,然后MyBatis会动态地生成接口的实现类,从而避免了繁琐的SQL映射配置。...
    99+
    2023-08-16
    mybatis java 开发语言 原力计划
  • Golang的gc与内存管理深度剖析
    Golang的gc与内存管理深度剖析 随着互联网的发展,越来越多的公司和开发者开始采用Go语言(Golang)开发应用程序。Go语言以其高效的并发性能和简洁的语法受到了广泛的关注和喜爱...
    99+
    2024-03-06
    golang 内存管理 gc go语言
  • 如何对C++资源管理内容分析研究
    这篇文章给大家介绍如何对C++资源管理内容分析研究,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。下面进行对C++资源管理的问题进行讲解,那么首先要对C++语言的概念进行了解,所谓C++语言:它是一种使用非常广泛的计算机...
    99+
    2023-06-17
  • 如何进行C++代码的资源管理?
    如何进行C++代码的资源管理以C++为例,资源管理是程序开发中非常重要的一环。良好的资源管理可以提高程序的性能和稳定性,减少内存泄漏和资源浪费。本文将介绍一些常用的C++资源管理技术和最佳实践。1.使用智能指针:C++11引入了智能指针的概...
    99+
    2023-11-02
    内存管理 资源分配 C++资源管理
  • 如何深度剖析Python语言特点
    这期内容当中小编将会给大家带来有关如何深度剖析Python语言特点,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。这里并不涉及python的特殊规则和细节,目标是通过示例使你快速了解Python语言的特点。...
    99+
    2023-06-17
  • C#中如何释放非托管资源
    这篇文章主要介绍“C#中如何释放非托管资源”,在日常操作中,相信很多人在C#中如何释放非托管资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中如何释放非托管资源”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-18
  • 深入理解Python虚拟机中字节(bytes)的实现原理及源码剖析
    目录数据结构创建字节对象查看字节长度字节拼接单字节字符总结数据结构 typedef struct { PyObject_VAR_HEAD Py_hash_t ob_s...
    99+
    2023-03-24
    Python虚拟机字节 Python虚拟机 Python 字节
  • 深度剖析阿里云ECS管理系统的功能与优势
    阿里云ECS管理系统的功能强大,可以帮助用户轻松地管理、监控和优化阿里云ECS云服务器。它提供了丰富的工具和功能,包括资源管理、故障恢复、性能监控、安全控制等,让用户能够更好地利用云计算资源,提高业务效率。 阿里云ECS管理系统的功能强大,...
    99+
    2023-11-05
    管理系统 阿里 深度
  • windows资源管理器如何修复
    要修复Windows资源管理器,您可以尝试以下方法:1. 重启资源管理器:按下Ctrl + Shift + Esc键打开任务管理器,...
    99+
    2023-09-11
    windows
  • windows资源管理器如何打开
    要打开Windows资源管理器,你可以通过以下几种方法之一:1. 使用快捷键:按下"Win"键 + "...
    99+
    2023-09-12
    windows
  • 如何深度剖析Java反射机制中的动态代理原理
    本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈...
    99+
    2023-06-17
  • win11如何调出资源管理器
    要调出Windows 11的资源管理器,您可以使用以下几种方法:1. 使用键盘快捷键:按下Win键(Windows图标键)+ E键,...
    99+
    2023-09-12
    win11
  • 如何剖析TFS 2010中工作区的改进细节
    今天给大家介绍一下如何剖析TFS 2010中工作区的改进细节。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。在TFS(Team Foundation Serve...
    99+
    2023-06-17
  • Linux管理硬件资源该如何理解
    这期内容当中小编将会给大家带来有关Linux管理硬件资源该如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。计算机的硬件主要包括内存(RAM)、中央处理器(CPU)、输入/输出(I/O)设备和硬盘(H...
    99+
    2023-06-28
  • win101909资源管理器卡如何解决
    这篇文章主要介绍“win101909资源管理器卡如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win101909资源管理器卡如何解决”文章能帮助大家解决问题。小编在这里根据不同情况准备了四种...
    99+
    2023-07-01
  • Git中如何管理二维码资源?
    Git中如何管理二维码资源? 二维码是一种常用的信息传递方式,特别是在移动互联网时代,二维码的应用越来越广泛。在开发中,我们经常需要将二维码资源存储到代码库中,并对其进行管理。本文将介绍如何使用Git进行二维码资源的管理。 一、为什么需要管...
    99+
    2023-09-26
    二维码 path git
  • 实时操作系统:深入剖析实时任务的调度与管理
    一、实时任务的调度 实时任务是指具有严格时限要求的任务,必须在规定的时间内完成,否则会导致系统故障或不可预知的行为。实时任务的调度是RTOS的核心功能之一,其主要目标是确保所有实时任务都能按时完成。 1、调度算法 RTOS中常用的调度算...
    99+
    2024-02-03
    实时操作系统 调度算法 任务管理 优先级调度 时间片轮转调度 速率单调调度
  • 如何深入剖析C++类模板应用代码
    本篇文章给大家分享的是有关如何深入剖析C++类模板应用代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++中有类继承的概念,意思就是能够实现与继承相同功能的一种应用。C++...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作