C和C++缺乏垃圾回收

C and C++ lack of garbage collection

本文关键字:C++      更新时间:2023-10-16

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

性能。对于高级语言,通常有两种类型的内存管理。有垃圾收集方法,还有苹果系统中的引用计数。在跟踪对象和取消分配对象时,这两种方法都会带来性能成本,并且会占用所需的内存和CPU时间。

由于C&C++相对来说是一种古老的语言,它们被设计成适应嵌入式系统和具有许多限制的各种设备,因此它们无法进行内存管理。

有了适当的练习和曝光量,管理C/C++应用程序应该不会那么困难。

顺便说一句,C#有一个垃圾回收。只有C和C++没有。

编辑:

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

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

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

根据微软文档,

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

这是一个特别有问题的问题,因为很难或不可能预测垃圾收集器何时运行或确切地需要多长时间才能完成。这可能会导致任务错过截止日期。

我链接到上面的文章更详细地描述了垃圾收集器的性能影响,以及在时间紧迫的情况下如何将其影响降至最低。

值得一提的是,实际上有人在努力制作C#和Java的实时版本。例如,请参阅实时Java。

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

因为这样效率更高。C*语言面向:

  • 生成尽可能快的二进制程序
  • 对人类来说仍然很容易理解(因此汇编程序虽然更快,但不能满足这一要求)

如果您进行了自动垃圾收集,这需要时间,有时程序没有必要正确运行。程序员可以根据具体情况决定是否需要。

C#有垃圾收集。

垃圾回收对程序员来说确实很好,但它需要运行时成本。C/C++是系统编程语言,因此,它们需要能够在裸机上运行——运行时尽可能少。这意味着像垃圾回收这样的事情是不可能的。

此外,垃圾回收会使您很难对程序的内存消耗进行推理。如果你正在设计一个负责让飞机保持在空中的实时系统,你不想冒GC暂停导致灾难性故障的风险。

原因有很多,至少与C:有关

  • C是20世纪70年代初的产物,请注意,像Fortran、Cobol、Pascal等较旧的语言也没有自动垃圾收集
  • C源于一种系统编程语言,因此往往不提供太多高级抽象(指针和流的级别和它一样高)
  • C和C++(通常)被编译为直接在操作系统(甚至裸机)上运行的本地二进制文件——请注意,大多数进行自动垃圾收集的语言都在VM或解释器下运行
  • C的哲学是,程序员处于知道何时应该分配或释放资源的最佳位置,并且足够熟练地编写代码来管理它
  • 正如其他人所提到的,AGC在性能关键代码方面玩得一塌糊涂

编辑

请注意,自1959年McCarthy将自动垃圾收集添加到Lisp中以来,它一直以某种形式存在。然而,直到20世纪90年代Java出现,它才真正成为"主流"编程语言中的一种东西;在这一点上,大多数系统都足够快,以至于我们愿意用(轻微的)性能打击来换取(稍微)更健壮的代码。

AGC在某些方面可以让生活变得更轻松,但它也在代码中引入了一小部分不可预测性。通常在C++中实践的RAII是所有手动内存管理和自动垃圾收集之间的一个很好的折衷方案。如果做得正确,它将为您提供无忧资源管理可预测性的所有好处。

相关文章:
  • 没有找到相关文章