c - 为什么 C 在 malloc 中没有内置的保守垃圾收集
问题描述
我们知道,内存泄漏是编写 C 程序时最常见/最严重的问题之一。我知道通过调用释放内存是程序员的责任free()
,但是将保守的垃圾收集器集成到 malloc 包中仍然是可行的。
当然,这个垃圾收集器是保守的,因为 C 不使用类型信息标记内存位置(与 Java 的成熟垃圾收集器不同),C 中的收集器无法推断数据实际上是 int eg 而不是指针. 因此,分配器必须保守地将一个块标记为可达,而实际上它可能不是。但没关系,它仍然可以正常工作,只是无法释放所有无法访问的块,总比没有好。
那么为什么 C 没有内置的保守垃圾收集malloc
来减轻程序员的负担呢?
解决方案
C 是一种旨在尽可能高效地执行的语言。它用于许多对性能敏感的环境,例如内核、嵌入式和实时系统。
因此,尽管在 C 中添加一个虚拟垃圾收集器是可能的(并且在技术上非常简单),但这会降低 C 的性能,因为它需要存储额外的数据来管理这个 GC(例如参见 Java 的 GC)。请注意,由于 Jérôme Richard 指出的指针算术,不可能制作完全通用的 C GC。内存块永远不会被指向并且仍然有效(由于间接访问,XOR-ing,...)
此外,C中的内存管理并不复杂,有经验的 C 程序员很少犯这样的错误(双重释放、内存丢失、读取未初始化的内存……)。还需要注意的是,有很多工具可以调试 C 程序,例如valgrind
可以轻松检查内存访问的正确性。
总之,如果您需要 GC 等高级功能,C 语言不适合您。C 允许非常高性能的计算,但它的学习曲线非常陡峭,并且注重性能而不是用户舒适度
推荐阅读
- javascript - 启用平滑滚动后,通过滚动更新 DOM 中元素的位置会延迟
- nlp - 如何从微调的BERT模型中获得多类置信度分数?
- reactjs - amCharts4`EventDispatcher 已处理`错误创建新系列
- https - SSL 证书问题:macOS 中的证书已过期
- angular - 通过 dialogRef 更新父组件而不关闭对话框
- java - JavaFX - 如何在不放大对象的命中框的情况下旋转可移动对象
- javascript - 如何将生成的数组附加到 js 选择框中的选项?
- ios - 为什么从并发队列异步调用`DispatchQueue.main.sync`成功但同步失败?
- python - 如何正确定义 PyTorch CNN 模型?
- java - 春天的网络客户端。接收多部分/表单数据