为什么C不需要垃圾收集器?

时间:2016-11-21 01:35:52

标签: c garbage-collection

我对此的理解归结为C&C的便携式汇编程序"以及减少开销的选择。是不是都有它?

2 个答案:

答案 0 :(得分:1)

首先,让我们清楚一下垃圾是什么。

垃圾的Java定义是不再可访问的对象。可达的精确含义有点深奥,但实际的定义是,如果你可以通过跟踪来自众所周知的地方(如线程堆栈或静态变量)的引用(指针)来获取对象,那么可能是可达。 (实际上,只要 可以到达的对象不被删除,一些不精确就可以了。)

您可以尝试将相同的定义应用于C和C ++。如果无法访问对象,则该对象是垃圾。

然而,这个定义的实际问题......以及C或C ++中的垃圾收集是指"指针是否像#34; value实际上是一个有效的指针。例如,未初始化的变量可以包含一个看起来像指向对象的指针的随机值。或者,当一个union类型覆盖带有long的指针时,垃圾收集器无法确定该联合是否包含一个或另一个......或两者都有。

但是,显然C程序可以调用malloc,忘记调用free,然后忘记堆节点的地址。该节点是垃圾。

C / C ++没有垃圾收集的原因有两个。

  • 这在文化上是不合适的"。这些语言的文化是将存储管理留给程序员。

  • 为C / C ++实现精确垃圾收集器在技术上是困难的(而且代价昂贵)。实际上,这样做会涉及使语言实施变慢的事情。

  • 不精确(即保守的)垃圾收集器很实用,但它们具有性能和(我听说过)可靠性问题。 (例如,保守的收集器不能移动非垃圾对象。)

如果(C / C ++垃圾收集器的)实现者可以假设程序员只编写严格符合C / C ++规范的代码,那将会更简单。但他们没有。

但你的回答似乎是,他们为什么设计这样的C?

这样的问题只能由设计师(在这种情况下,已故的丹尼斯里奇)或他们的着作权威地回答。

正如您在问题中指出的那样,C 设计为简单且接近硬件"。

然而,C是在1970年代早期设计的。在那些日子里,需要垃圾收集器的编程语言很少见,GC技术也不像现在那样先进。

即使是现在,垃圾收集语言(如Java)仍然不适合需要可预测的实时"性能

简而言之,我怀疑设计人员认为垃圾收集会使语言不符合预期目的。

答案 1 :(得分:0)

有一些为C或C ++构建的垃圾收集器: 请检查http://www.hboehm.info/gc/

正如您所说,垃圾收集违背了C和C ++声称的性能目的,因为它需要跟踪分配和/或引用计数。