不同语言的内存管理是不是足够相似以转移我的知识?

Posted

技术标签:

【中文标题】不同语言的内存管理是不是足够相似以转移我的知识?【英文标题】:Is memory management in different languages similar enough to transfer my knowledge?不同语言的内存管理是否足够相似以转移我的知识? 【发布时间】:2009-06-17 10:55:28 【问题描述】:

我刚刚开始学习编程。到目前为止,我对 Objective-C 中的内存管理有所了解。学习它并不容易。

那么,出于好奇,C、C++、Java 等主要语言中使用的内存管理是否与我所学的类似?

【问题讨论】:

【参考方案1】:

内存管理有两种截然不同的风格:非托管和托管。

非托管是程序员负责内存分配的 C/C++。

Managed 类似于 Java/.Net,内存为您分配但由虚拟机清理(“垃圾收集”)。

在这两种口味中,您会发现许多变化。

【讨论】:

从技术上讲,C/C++ 内存管理是手动的。但是在带有智能指针的 C++ 中,这个问题大大减少了(把它想象成 C++ 有一个穷人的垃圾收集器 [你甚至可能会争辩说它只是一个对穷人的高度可调的垃圾收集器])。 是的,但智能指针仍然是手动内存管理。您刚刚起草了一些其他代码来帮助完成这项工作。【参考方案2】:

不,平台之间可能会有很大差异 - 即使在同一个平台内,也可能有各种不同的选项。 (例如,在 C++ 中,您可以使用自动指针、Boehm GC 等)

请注意,Java 和 .NET大部分具有相似的内存管理。

【讨论】:

【参考方案3】:

不,不一样。

在 Java 和 .NET 语言中,有涉及垃圾收集器的自动内存管理的概念。垃圾收集器的实现也因语言和平台而异。

C/C++ 没有自动内存管理,由程序员自己管理内存。

总之,不同的语言是不一样的。

【讨论】:

【参考方案4】:

我不知道在 Objective-C 中是如何管理内存的,但是 C 和 C++ 使用手动内存管理,而 Java 内置了垃圾收集,并且不允许手动内存管理。所以它们是非常不同的。

【讨论】:

【参考方案5】:

内存管理方法因语言和平台而异,不仅在程序员的可见性和控制级别上,而且在实施方面。

即便如此,当您深入到操作系统级别时,分配和释放内存的基本原理大致相同。当然存在差异、调整和优化,但通常程序员不必处理这些细节。

Objective-C 是一个有趣的混合体,因为该语言的 2.0 版添加了选择性垃圾收集,但也保留了使用引用计数(保留/释放/自动释放)的能力。事实上,相同的代码可以在任何一种模式下运行,具体取决于编译标志和同一进程中加载​​的其他代码的设置。这对于编程语言来说是非典型的——通常您会根据您编写的代码获得托管(自动)或非托管(手动),有时语言/平台根本不提供供您选择的方式(例如 Java)。

一种味道不一定比另一种更好,关于“真正的程序员[不]使用垃圾收集”是否仍然偶尔有宗教争论,但不要过分担心。了解各种内存管理方法如何不会伤害任何人的一般知识,并且通常了解您编码所用语言的方法就足够了。

【讨论】:

【参考方案6】:

生日,

在各种语言中,唯一可以说的内存管理相似之处就是目标。即:

为进程提供固定的内存块, 保护该块之外的内存不被进程访问, 为变量/对象/函数/等提供动态分配机制。在这个过程中, 确保这些项目的内存分配是在合理的边界上完成的,从处理器的角度来看是合理的, 提供一种根据需要释放内存的机制, 清理(垃圾收集)未使用的对象, 将碎片化内存合并为连续的占用内存池, 等

各种语言和运行时环境提供了至少实现其中一些功能的机制。

HTH

干杯,

【讨论】:

以上是关于不同语言的内存管理是不是足够相似以转移我的知识?的主要内容,如果未能解决你的问题,请参考以下文章

什么是确定 2 个字符串是不是“足够相似”的好指标

JS高级——内存管理和闭包

JS高级——内存管理和闭包

JS高级——内存管理和闭包

操作系统基础知识

Python深度探索:内存管理机制