我现在想如何分配记忆。

例如,如果我有代码怎么办:

x = new int[5]; 
y = new int[5];

如果这些分配在RAM中的实际状态?对于2个变量,共享每个变量或块(内存页面或32位上的4KB)的整个块(内存页面或4kb的大小)?

我在任何手册中都找不到答案。感谢所有答复。

我在Wikipedia上发现:页面的内部碎片很少需要使用精确的页面。结果,最后一页可能只会部分填满,从而浪费了一些内存。较大的页面大小清楚地增加了这种方式浪费内存的潜力,因为将内存的可能未使用的部分加载到主内存中。较小的页面尺寸可确保与分配所需的实际内存量更紧密。例如,假设页面大小为1024KB。如果一个过程分配了1025KB,则必须使用两页,从而导致1023KB未使用的空间(其中一页完全消耗了1024KB,另一页仅消耗了1024KB,另一页仅消耗了1KB)。

那是我问题的答案。无论如何,谢谢大家。

有帮助吗?

解决方案

典型的分配器实现将首先调用操作系统以获取大量内存块,然后为了满足您的要求,它将为您提供一部分内存,这被称为 子分配. 。如果它用完了内存,它将从操作系统中获得更多收益。

分配器必须跟踪其从操作系统中获得的所有大块,也必须跟踪其分发给客户的所有小块。它还必须接受客户的障碍。

典型的子分配算法保留了每个大小的返回块的列表,称为 自由职业者 并且始终试图满足自由职业者的要求,只有在自由职业者为空时才进入主块。这种特殊的实现技术对于普通程序非常快,而且非常有效,尽管如果请求尺寸到处都是糟糕的分裂属性(对于大多数程序而言,这不是通常的)。

像GNU的Malloc实施这样的现代化分配器很复杂,但已有数十年的经验建造,应该被认为是如此的好,以至于很少需要编写自己的专业分类器。

其他提示

您没有在手册中找到它,因为它未由标准指定。也就是说,大多数时间X和Y都会并排(继续前进, cout<< hex << 他们的地址)。

但是标准力量没有任何力量,因此您不能依靠它。

每个过程都有不同的片段与过程地址空间相关的不同段:1)文本段::放置了您的代码2)堆栈段预订的。除此之外,它还存储初始化和非初始化的静态数据(BS等)。

因此,每当您调用新功能时(我猜它在内部使用malloc,但是新类使处理内存更安全),它会在数据段中分配指定的字节数。当然,您在运行程序时打印的地址是虚拟的,需要将其转换为物理地址。.但这不是我们的头痛,OS内存管理单元为我们做到了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top