如何扩展已分配的内存

时间:2017-12-05 02:21:58

标签: c++ c c++11 memory-management

是否有类似std::realloc的内容,但如果无法扩展现有内存则无效(当然它会让您知道它失败了)?

我的意思是真正扩展到位。不要复制到新创建的内存块。

3 个答案:

答案 0 :(得分:3)

与其他答案所说的相反,您需要的功能可以由C标准ibrary提供。这不是出于某种原因。

考虑加入C标准,参见例如http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1527.pdf(搜索try_realloc)。我不知道C委员会是否还在继续这样做。

最重要的是,目前还没有这样的功能。

答案 1 :(得分:2)

,没有这样的功能。

根据您的评论,我认为您可能会对以下内容感兴趣:`std::realloc` for non-POD typesWhat is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one?

PS:重新解决您的问题,因为现有的方法论通常已经足够了。

答案 2 :(得分:0)

  

真正扩展到位。不要复制到新创建的内存块。

这是不可能的,因为virtual address spaceinstruction set architectures(或x86-64的直接寻址(非分段)ARM的工作方式, MIPS,RISCV等......)。

(因此,强大的限制主要不是来自软件,而是来自您的硬件,在上个世纪,已经提出了一些分段架构,如iAPX432Rekursiv,但失败了)

假设您想重新分配一兆字节的指针区域以获得4兆字节的内存。但your process的虚拟地址空间可能包含一些其他数据 - 对于某些其他 malloc - ed区域或其他类似code segment,{{3等等......前面使用了两兆字节。所以你需要移动你的(不断增长的)区域 - 通过向你的操作系统询问一些新的4兆字节区域 - 并从前一个区域复制。

在Linux上,查看call stack(例如,在终端中输入man 5 proc)和proc(5)。在某个终端中运行cat /proc/self/mapscat /proc/$$/maps命令,以更好地直观了解虚拟地址空间。请注意,所有内存管理都是在mmap以及相关(有时是旧sbrkmmap(2)之上完成的。因此,mallocoperator new(有时)使用它们(大部分时间,以前重复使用free - d区域更为可取)。使用system calls来探索现有程序完成的系统调用。

BTW,在Linux上,您的C标准库和C ++标准库都是strace(1)。你可以研究他们的源代码。

另请阅读free software以了解更多操作系统的工作原理。考虑在简化的Y86架构上阅读Operating Systems: Three Easy Pieces上的一本书(或至少一些Computer Architecture)。你对计算机的运行方式有一些深刻的误解。