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

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

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

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

Bjarne Stroustrup 说 :

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

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

Java和C#是更高级别的语言,因为它们通过垃圾收集等方式牺牲了性能,从而将开发人员从那些“卑鄙”的任务中卸下来。 这使得它们更易于访问更广泛的任务,并缩短了大型项目的开发和调试时间。

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

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

这些语言在设计时(并且仍在设计)的主要特征和目标之一是为用户留下很多自由,因此即使垃圾收集器要进入新标准,也不会强迫它在用户身上。 它不符合C和C ++的哲学。

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