C和C++缺乏垃圾收集

pet*_*ent 0 c c++ garbage-collection

为什么像C和C++这样的语言没有垃圾收集?我习惯了Java,所以我不确定没有它的好处是什么?

Gha*_*san 8

性能.对于更高级语言,通常有两种类型的存储器管理.有垃圾收集方法,Apple系统中有引用计数.在跟踪对象和取消分配对象时,它们都会产生性能成本,并且占用内存和所需的CPU时间.

由于C&C++相对来说是旧语言,因此它们被设计为适合嵌入式系统和具有许多约束的各种设备,因此它们无法承受内存管理.

通过适当的练习和曝光,相对较好地管理C/C++应用程序并不困难.

BTW,C#有垃圾收集.只有C和C++没有.

编辑:

正如其他人可能已经添加的那样,在较新的C++标准中,存在将引用计数方法应用于内存管理的共享指针 shared_ptr.


EJo*_*ica 5

除了其他人指出的关于性能的内容(这是完全正确的)之外,我还想指出垃圾收集实时系统的一个主要问题,因为它引入了不可预测性。

回想一下,实时系统是一个系统,其中任务必须满足特定的时间限制才能正确。例如,如果您正在为一个机器人编写代码,但它没有发现它即将撞墙而停止,那么显然这不是一个正确的结果。你已经这样做之后你发现你将要撞墙的事实是完全没有用的。

从 Microsoft文档中

要回收对象,垃圾收集器必须停止应用程序中所有正在执行的线程。在某些情况下,例如当应用程序检索数据或显示内容时,可能会在关键时刻进行完整的垃圾回收并影响性能。

这尤其成问题,因为很难或不可能预测垃圾收集器何时运行或完成需要多长时间。这可能会导致任务错过截止日期。

我上面链接的文章更详细地描述了垃圾收集器的性能影响以及在时间紧迫的情况下可以最大限度地减少其影响的方法。

就其价值而言,实际上有人在努力制作 C# 和 Java 的实时版本。例如,参见实时 Java

我确实意识到绝大多数系统都不是实时的,但是对于那些(引擎控制等)来说,拥有一种没有垃圾收集的语言有明显的好处。