Java有垃圾收集和为什么C和C ++语言没有垃圾收集?

时间:2015-04-22 06:41:56

标签: java c++ c

我知道C语言有malloc / free之类的东西,而C ++语言中有new / using-a-destructor用于内存管理,但我想知道为什么这些语言没有“新更新”自动内存管理(垃圾收集)? java有垃圾收集设施,为什么没有C& C ++

任何人都可以为此简要解释一下吗?

4 个答案:

答案 0 :(得分:4)

C和C ++被设计为接近金属,当它们被设计时,垃圾收集几乎不可能。当你想到垃圾收集时,必须有一个数据结构用于引用计数和跟踪分配,这又会产生内存和性能开销。当设计C和C ++时,这些不是目标,因为它更接近硬件。

Bjarne Stroustrup said

  

我曾希望可以选择启用垃圾收集器   将成为C ++ 0x的一部分,但有足够的技术问题   我只想详细说明如何这样做   如果提供,收集器将与语言的其余部分集成。原样   基本上所有C ++ 0x特性的情况,一个实验   实施存在。

答案 1 :(得分:2)

C和C ++是历史上相对较低级别的编程语言,这意味着他们对开发人员负有正确运行的责任。对内存块的分配和释放进行细粒度控制是其中的一部分,因为垃圾收集可能会对性能产生显着影响,并且并不总是有计划的'。它还占用了昂贵资源的开销,因为每个分配的对象都需要被引用计数和编目'稍后自动删除。

Java和C#是更高级别的语言,因为他们牺牲了垃圾收集之类的性能来将开发人员从那些' menial'任务。这使得它们可以更容易地访问更广泛的任务,并减少大型项目的开发和调试时间。

最终结果是所有语言都不同'工具'在程序员的工具箱中。 C和C ++产生的开销很小,因此具有高性能的高性能密集型操作,例如驱动程序,低级操作系统代码和游戏引擎。 C#和Java更多地用于生产力软件和Web应用程序,其中第二级性能不太重要。

答案 2 :(得分:0)

在C ++中有一些垃圾收集的实现,但如果你不想自己处理内存释放,目前的共识是使用引用计数和类似的技术。

这两种语言的主要特征和目标之一就是为用户留下了很多自由,所以即使垃圾收集者要输入新标准,它也不会# 39;强迫用户使用。它不符合C和C ++的哲学。

答案 3 :(得分:0)

Java是为快速开发而制作的。内存管理基本上外包给JVM,这样你就可以更专注于问题而不是担心内存泄漏等问题。它可能永远不会像C / C ++中那样有效,但是你可以把它从实际开始,它可以说更容易学习。