我现在想知道这些指令如何分配内存。
例如,如果我得到代码怎么办:
x = new int[5];
y = new int[5];
如果这些都被分配了,那么它在 RAM 中的实际情况是什么样的?
是否为每个变量保留整个块,或者块(内存页或如何称呼它 - 32 位上的 4KB 大小)为 2 个变量共享?
我在任何手册中都找不到我的问题的答案。感谢您的所有回复。
我在维基百科上找到:
页面内部碎片
进程很少需要使用精确数量的页面。因此,最后一页可能只是部分满,浪费了一些内存。较大的页面大小显然会增加这种方式浪费内存的可能性,因为更多可能未使用的内存部分会加载到主内存中。较小的页面大小可确保更接近分配中所需的实际内存量。
例如,假设页面大小为 1024KB。如果一个进程分配 1025KB,则必须使用两个页面,从而导致 1023KB 的未使用空间(其中一个页面完全消耗 1024KB,而另一页面仅消耗 1KB)。
这就是我问题的答案。不管怎样谢谢大家。
典型的分配器实现将首先调用操作系统来获取巨大的内存块,然后为了满足您的请求,它会给您一块内存,这称为二次分配。如果内存不足,它将从操作系统获取更多内存。
分配器必须跟踪它从操作系统获得的所有大块以及它分发给客户端的所有小块。它还必须接受客户端返回的块。
典型的子分配算法保留每个大小的返回块的列表,称为freelist并且总是尝试满足来自空闲列表的请求,仅当空闲列表为空时才转到主块。这种特殊的实现技术对于普通程序来说非常快速且非常有效,但如果请求大小到处都是(这对于大多数程序来说并不常见),它会产生糟糕的碎片属性。
像 GNU 的 malloc 实现这样的现代分配器很复杂,但已经建立了数十年的经验,并且应该被认为非常好,以至于很少需要编写自己的专用子分配器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)