【发布时间】:2014-10-30 00:48:12
【问题描述】:
注意:这是我为了解 C/C++ 中程序和 malloc 的功能而创建的假设情况。
假设我分配了 10k 个整数,它们都在内存中连续分配。现在,我释放了这 10k 个整数中的每个备用元素。现在,我想分配一个需要 8 个字节的长整数。由于上述 5k 个位置都没有连续的 8 个字节,程序是否为这个变量分配了一个新的内存位置?如果将来我将只使用 > 4 字节的位置,那么我只是在浪费整个内存吗?或者编译器是否采取了必要的步骤,以便以后这些剩余的 5k 位置是连续的?
编辑:致那些将其标记为重复的人。 好的,让我们说它使用分页,它通过将页面重新映射到物理内存中的连续块来处理碎片。即使那样,这也意味着在虚拟内存中所有这些地址位置都不再可用,对吧?那么,那些内存位置不可用?是的,我知道这是碎片等问题。我的问题如下:
运行时程序有什么方法可以知道这个问题的出现并以某种方式尝试以一种好的方式管理其资源?由于 C 是一种完全编译的语言,我认为这是不可能的。 JAVA 或 C# 运行时环境会做这样的事情吗?重新组织它们的对象,使它们在堆空间中占用一个连续的内存块?如果发生这种情况,他们是否必须更改每个引用变量的值?因为他们在堆上的位置(以及他们的地址)正在改变?
【问题讨论】:
-
你是如何分配这些整数的?
-
它们都在内存中连续分配。你怎么知道的?
-
你会发现this question值得一读。
-
一个简单的答案是告诉你你做错了。如果您分配许多相同大小的实例,则使用内存池,而不是 malloc/new。
-
回答你的新问题,是的。这就是所谓的垃圾收集器。有许多不同类型的垃圾收集算法,但压缩是非常常见的实现。您也可以用 C 语言编写代码来执行此操作。但是你不能使用原始指针,因为就像你说的,它们的地址会改变。您必须使用间接引用。垃圾收集器会维护一个映射表,将这些引用映射为指向实际内存位置的指针。
标签: java c++ memory-management clr