上传者: 26786277
|
上传时间: 2022-12-29 17:17:10
|
文件大小: 1.81MB
|
文件类型: PDF
内存分配和回收更快,因为每次都是在一个池中完成的。分配可以在 O(1)时间内完
成,释放内存池所需时间也差不多(实际上是 O(n)时间,不过在大部分情况下会除
以一个大的因数,使其变成 O(1))。
可以预先分配错误处理池(Error-handling pools),以便程序在常规内存被耗尽时仍
可以恢复。
有非常易于使用的标准实现。
池式内存的缺点是:
内存池只适用于操作可以分阶段的程序。
内存池通常不能与第三方库很好地合作。
如果程序的结构发生变化,则不得不修改内存池,这可能会导致内存管理系统的重
新设计。
您必须记住需要从哪个池进行分配。另外,如果在这里出错,就很难捕获该内存池。
3. 引用计数
在引用计数中,所有共享的数据结构都有一个域来包含当前活动“引用”结构的次数。
当向一个程序传递一个指向某个数据结构指针时,该程序会将引用计数增加 1。实质上,是
在告诉数据结构,它正在被存储在多少个位置上。然后,当进程完成对它的使用后,该程序
就会将引用计数减少 1。结束这个动作之后,它还会检查计数是否已经减到零。如果是,那
么它将释放内存。
在 Java,Perl 等高级语言中,进行内存管理时使用引用计数非常广泛。在这些语言中,
引用计数由语言自动地处理,所以您根本不必担心它,除非要编写扩展模块。由于所有内容
都必须进行引用计数,所以这会对速度产生一些影响,但它极大地提高了编程的安全性和方
便性。
以下是引用计数的好处:
实现简单。
易于使用。
由于引用是数据结构的一部分,所以它有一个好的缓存位置。
不过,它也有其不足之处:
要求您永远不要忘记调用引用计数函数。
无法释放作为循环数据结构的一部分的结构。
减缓几乎每一个指针的分配。
尽管所使用的对象采用了引用计数,但是当使用异常处理(比如 try 或 setjmp()/
longjmp())时,您必须采取其他方法。
需要额外的内存来处理引用。
引用计数占用了结构中的第一个位置,在大部分机器中最快可以访问到的就是这个
位置。