C++内存管理变革(2):最袖珍的垃圾回收器

概述

C/C++最被人诟病的,可能是没有一个内存垃圾回收器(确切是说没有一个标准的垃圾回收器)。本文讨论的内容要点是,在C/C++中实现一个最袖珍的、功能受限的垃圾回收器。这个垃圾回收器区别于其他垃圾回收器的主要特征是:

1. 袖珍但具实用性。整个垃圾回收器代码行数100行左右(不含空白行),相当小巧。相对而言,它的功能也受到一定的限制。但是它在很多关键的场合恰恰非常有用。该垃圾回收器以实用作为首要目标,已经成为我和身边一些同事编程的重要工具。

2. 高性能。区别于其他垃圾回收器的是这个袖珍的垃圾回收器非但不会导致性能的下降,反而提高了程序的时间性能(分配的速度加快)和空间性能(所占内存空间比正常的malloc/new少)。而这也是实用的重要指标。

本文算法并不复杂。技术上的东西,很多点明了就没有什么了,也许重要的意义是在于其首创性。其实,boost[1]提供的pool组件也在试图提供类似功能的自动内存回收能力。但是实现相对复杂且低效(基于经典的mempool技术[2])。

现在,你也许急着想看看,这个垃圾回收器长什么样了。闲话少叙,那就让我们就开始一步步把谜底揭开吧。

思路

理解该垃圾回收器的关键点在于,是在于理解它的目标:为一个复杂的局部过程(算法)提供自动内存回收的能力。

所谓局部过程(算法),是指那些算法复杂性较高,但在程序运行期所占的时间又比较短暂的过程[3]。例如:搜索引擎的搜索过程、读盘/存盘过程、显示(绘制)过程等等。通常这些过程可能需要申请很多内存,而且内存分配操作的入口点很多(就是调用new的地方很多),如果每调用一次new就要考虑应该在什么地方delete就徒然浪费我们宝贵的脑力,使得我们无法把全力精力集中在算法本身的设计上。也许就是在这种情形下,C/C++程序员特别羡慕那些具备垃圾回收器的语言。相对而言,如果算法复杂性不高的话,我们的程序员完全有能力控制好new/delete的匹配关系。并且,这种“一切皆在我掌控之中”的感觉给了我们安全感[4]和满足感。

因此,这个垃圾回收器的重心并不是要提供一个理论上功能完备的内存自动回收机制。它只是针对复杂性较高的局部过程(算法),为他们提供最实效的内存管理手段。从局部过程的一开始,你就只管去申请、使用内存,等到整个算法完成之后,这个过程申请的大部分内存(需要作为算法结果保留的例外),无论它是在算法的那个步骤申请的,均在这个结束点上由垃圾回收器自动销毁。我们画个示意图:

图 1

时间: 2023-12-03 16:45:15

C++内存管理变革(2):最袖珍的垃圾回收器的相关文章

C++内存管理变革(3):另类内存管理

最简单的C++/Java程序 最简单的Java程序: class Program { public static void main() { new int; } } 对应的C++程序: void main() { new int; } 我想没有一个Java程序员会认为上面的Java代码存在问题.但是所有严谨的C++程序员则马上指出:上面这个C++程序有问题,它存在内存泄漏.但是我今天想和大家交流的一个观念是:这个C++程序没有什么问题. DocX程序的内存管理 DocX是我开发的一个文档撰写工

C++内存管理变革(4): boost::object_pool

言归正传.我们在内存池(MemPool)技术详解已经介绍了boost::pool组件.从内存管理观念的变革来看,这是是一个传统的MemPool组件,尽管也有一定的改进(但只是性能上的改进).但boost::object_pool不同,它与我在C++内存管理变革强调的观念非常吻合.可以认为,boost::object_pool是一种不通用的gc allocator组件. 我已经多次提出gc allocator的概念.这里仍然需要强调一下,所谓gc allocator,是指具垃圾回收能力的alloc

C++内存管理变革

引言 C/C++语言的内存管理经历了几次变革,但至今仍未能趋于成熟.这几次变革主要包括: 1. 从malloc/free到new/delete.这场变革是OOP技术兴起的产物.C++是强类型语言,new/delete的主要成果也就是加强了类型观念,减少了强制类型转换的需求.但是从内存管理角度看,这个变革并没有多少的突破性. 2. 从new/delete到内存配置器(allocator).自从STL被纳入C++标准库后,C++世界产生了巨大的变化.而从内存管理角度来看,allocator的引入也是

从JVM的内存管理角度分析Java的GC垃圾回收机制_java

一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.本篇文章首先简单介绍GC的工作原理之后,然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能.    GC的基本原理    Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放.     对于程序员来说,分配对象使用ne

c++内存管理学习纲要

本系列文章,主要是学习c++内存管理这一块的学习笔记. 时间:6.7-21 之下以技术内幕的开头语,带入到学习C++内存管理的技术中吧: 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,因此要想成为C++高手,内存管理一关是必须要过的! 笔记汇总: 1.C++内存管理学习笔记(1) 2.C++内存管理学习笔记(2) 3.C++内存管理学习笔记(3) 4.C++内存管理学习笔记(4) 5.C++内存管理学习笔记(5) 6.C++内存管理学习笔记(6) 7.C++内存管理学习笔记(7

c++内存管理学习笔记结束语

         刚开学学习内存管理这一块时,发现需要对一些知识需要做一些笔记,打算向以前学习的方式一样,写在纸上,鉴于以前自己笔记的莫名的丢失,所以就打算发在了博客上.写在博客上有这么几个好处, 一是互联网上的学习资源很丰富,随时可以查找学习:二是利用博客的形式来做笔记能够与其他学习者分享.互相讨论.互相学习(虽然目前评论数不多-.):三是博客内容不容易丢失,除非哪天csdn说不做了,哈哈.        在学习过程中,我读了很对的相关书籍和文献,以及网上其他人的优秀博客.其中那些精辟到位的技

c#内存管理.

尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识.明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的.在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理. 当你在执行程序的时候内存中有两个地方用于存储程序变量.如果你还不知道,那么就来看看堆和栈的概念.堆和栈都是用于帮助我们程序运行的,包含某些特殊信息的操作系统内存模块.那么堆和栈有什么不同呢? 堆VS栈的区

现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分:Code Cache(代码缓存区).Perm Gen(永久代).Jvm Stack(java虚拟机栈).Local Method Statck(本地方法栈). HotSpot虚拟机GC算法采用分代收集算法: 1.一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直

java内存管理(堆、栈、方法区)

java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁