文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-17 17:02

关注

如何深度剖析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。

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯