C++ new/new[],它是如何分配内存的?

标签 c++ memory-management malloc new-operator ram

我现在想知道这些指令是如何分配内存的。

例如,如果我得到代码怎么办:

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

如果分配了这些,它在 RAM 中的实际情况如何? 是为每个变量保留整个 block 还是为 2 个变量共享 block (内存页或你怎么调用它 - 32 位上的 4KB 大小)?

我无法在任何手册中找到我的问题的答案。感谢所有回复。

我在维基百科上找到: 页面内部碎片 流程很少需要使用确切数量的页面。结果,最后一页很可能只被部分填满,从而浪费了一些内存。较大的页面大小显然会以这种方式增加浪费内存的可能性,因为更多可能未使用的内存部分被加载到主内存中。较小的页面大小确保与分配中所需的实际内存量更接近。 例如,假设页面大小为 1024KB。如果进程分配 1025KB,则必须使用两页,从而导致 1023KB 未使用空间(其中一页完全占用 1024KB,另一页仅占用 1KB)。

这就是我的问题的答案。无论如何,谢谢你们。

最佳答案

一个典型的分配器实现会首先调用操作系统来获取巨大的内存块,然后为了满足您的请求它会给您一 block 内存,这被称为子分配。如果内存不足,它将从操作系统获取更多内存。

分配器必须跟踪它从操作系统获得的所有大块以及它分发给客户的所有小块。它还必须接受客户端返回的 block 。

典型的子分配算法保留了一个称为freelist 的返回 block 列表,并始终尝试满足来自freelist 的请求,只有在freelist 为空时才转到主 block 。这种特殊的实现技术对于普通程序来说非常快速且非常有效,但如果请求大小无处不在(这对于大多数程序来说并不常见),它会产生严重的碎片化特性。

像 GNU 的 malloc 实现这样的现代分配器很复杂,但已经建立了数十年的经验,应该被认为非常好,很少需要编写自己的专用子分配器。

关于C++ new/new[],它是如何分配内存的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420891/

相关文章:

c++ - 遍历带有非类型模板参数的模板基类的CRTP继承链

c++ - SDL 2.0 中的 SDL_ACTIVEEVENT 等效项?

c - C中的宏内存占用?

c - 当我们用负参数调用 Malloc 时会发生什么?

c - 使用可调整大小的数组初始化列表结构的正确方法

c - 如何避免 realloc 溢出?

c++ - 当被系统 DLL 调用时,Hooked VirtualAlloc 返回 nullptr

c++ - 是否可以在基类构造函数之前运行成员初始值设定项?

c - 使用 "calloc"和 "realloc"

c++ - 理解c++中的析构函数