我知道C语言有malloc / free之类的东西,而C ++语言中有new / using-a-destructor用于内存管理,但我想知道为什么这些语言没有“新更新”自动内存管理(垃圾收集)? java有垃圾收集设施,为什么没有C& C ++
任何人都可以为此简要解释一下吗?
答案 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 ++中那样有效,但是你可以把它从实际开始,它可以说更容易学习。