是否有类似std::realloc
的内容,但如果无法扩展现有内存则无效(当然它会让您知道它失败了)?
我的意思是真正扩展到位。不要复制到新创建的内存块。
答案 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 types和What is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one?
PS:重新解决您的问题,因为现有的方法论通常已经足够了。
答案 2 :(得分:0)
真正扩展到位。不要复制到新创建的内存块。
这是不可能的,因为virtual address space对instruction set architectures(或x86-64的直接寻址(非分段)ARM的工作方式, MIPS,RISCV等......)。
(因此,强大的限制主要不是来自软件,而是来自您的硬件,在上个世纪,已经提出了一些分段架构,如iAPX432或Rekursiv,但失败了)
假设您想重新分配一兆字节的指针区域以获得4兆字节的内存。但your process的虚拟地址空间可能包含一些其他数据 - 对于某些其他 malloc
- ed区域或其他类似code segment,{{3等等......前面使用了两兆字节。所以你需要移动你的(不断增长的)区域 - 通过向你的操作系统询问一些新的4兆字节区域 - 并从前一个区域复制。
在Linux上,查看call stack(例如,在终端中输入man 5 proc
)和proc(5)。在某个终端中运行cat /proc/self/maps
和cat /proc/$$/maps
命令,以更好地直观了解虚拟地址空间。请注意,所有内存管理都是在mmap
以及相关(有时是旧sbrk
)mmap(2)之上完成的。因此,malloc
或operator new
(有时)使用它们(大部分时间,以前重复使用free
- d区域更为可取)。使用system calls来探索现有程序完成的系统调用。
BTW,在Linux上,您的C标准库和C ++标准库都是strace(1)。你可以研究他们的源代码。
另请阅读free software以了解更多操作系统的工作原理。考虑在简化的Y86架构上阅读Operating Systems: Three Easy Pieces上的一本书(或至少一些Computer Architecture)。你对计算机的运行方式有一些深刻的误解。