【发布时间】:2014-10-25 02:45:20
【问题描述】:
我对 realloc 的理解是,如果内存在分配点之外连续可用,它可以尝试在不复制的情况下扩展当前分配。
在阅读https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md 时,我了解到大多数分配器都避免就地重新分配
。许多内存分配器不支持就地重新分配,尽管大多数都可以。这来自现在臭名昭著的 realloc() 设计,以不透明地执行就地重新分配或 allocate-memcpy-deallocate 循环。这种缺乏控制随后迫使所有基于 clib 的分配器设计避免就地重新分配,其中包括 C++ 的 new 和 std:allocator。
正如另一个问题 (Why is there no reallocation functionality in C++ allocators?) 中关于 C++ 中缺少重新分配器的回答,其中接受的答案提到这样的分配器会禁止使用 C 库中的 realloc,但没有回答为什么不尝试制作 realloc 来扩展如果可能的话,当前的记忆?
【问题讨论】:
-
可能是因为它做了很多工作却没有多少好处,而且它使事情变得更加混乱,特别是当你混合使用构造函数和析构函数时(例如,你会得到两种不同的行为,具体取决于关于它是否重新分配,因为在一种情况下会调用一堆复制构造函数和析构函数,而在另一种情况下则不会)。
-
@MichaelAaronSafyan 因此,realloc 是一个 C 库函数,如果数据完全复制到其他地方,它不能确保调用析构函数,这是调整大小的原因,我们做类似的事情为适当大小的数据调用 malloc,复制对象并在先前分配上调用析构函数?
-
我不知道为什么事情是按照原来的方式设计的。我只是在猜测它以及可能阻止它的一些明显困难/障碍。
-
@MichaelAaronSafyan:如果每次有人回答“为什么 X 不做 Y”我都能得到一分钱就好了?下意识地“因为这是无益的大量工作”......
标签: c++ memory memory-management stdvector