suk*_*nrt 4 c++ memory memory-management stdvector
我对realloc的理解是,如果内存连续超出分配点,它可以尝试扩展当前分配而不复制.
在阅读此https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md时,我发现大多数分配器都避免了就地重新分配
.许多内存分配器不支持就地重新分配,尽管大多数内存分配器都可以.这来自现在臭名昭着的realloc()设计,它不透明地执行就地重新分配或分配memcpy-deallocate循环.这种缺乏控制随后迫使所有基于clib的分配器设计避免就地重新分配,包括C++的new和std:allocator.
正如在另一个问题(为什么C++分配器中没有重新分配功能?)中所回答的那样,C++中缺少重新分配器,其中接受的答案提到这样的分配器会禁止重新分配使用C库但不回答为什么不尝试制作realloc如果可能扩展当前内存?
为什么不做一个?实际上,有提议要做到这一点:
尝试执行“就地重新分配”实际上没有什么好处,因为常见的情况是没有空间就地扩展已分配的内存块。任何好的分配器都会将避免碎片作为其首要任务之一 - 如果不这样做,可能会导致内存需求的灾难性爆炸,并很快导致分配失败,而大多数程序都无力处理这种情况,尤其是在 32 位地址中空间。为了避免碎片,分配器需要遵循最适合的策略。
因此,对于一个好的现实世界分配器,可以就地扩展的主要情况是当没有先前释放的块可用时,并且分配发生在“堆顶部”。对于非常简单的程序,仅调整单个分配的大小,而在这些调整大小之间没有发生其他分配,则就地扩展可能具有潜在的严重性能优势。这在用 C 编写的单线程程序中是合理的,但对于 C++ 程序则不然,因为在 C++ 程序中几乎所有操作都在进行隐藏的动态分配。
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |