标准分配器中的Realloc函数

18

对于在std::vector等中使用的标准分配器接口,是否支持重新分配?我有一个非常特殊的用例,直接使用realloc将比分配、移动和释放更为高效。

编辑:抱歉-我绝对没有意图调用真正的realloc,我指的是具有这些语义的函数。实际上,我正在后台从堆栈上进行分配,如果我再次从堆栈上进行分配,则无法释放其下面的内存,这是一种完全浪费,因为没有必要再次进行分配,因为有大量连续的空闲空间可用。因此,如果我可以一次性地被要求重新分配,那么我就可以避免首先分配一些东西并浪费一些内存,然后移动vector的所有内容。

3个回答

22

2
这里的“failed”一词是什么意思?是未能说服委员会吗? - Patrick Fromberg
2
是的。答案中链接的提案已经被提交并被拒绝。 - Howard Hinnant
1
有一个更近的提案 - https://github.com/cplusplus/papers/issues/123 也被拒绝了。我个人认为它比2006年的那些提案要差。 - Bruce Adams
3
我们在将分配器的大小反馈进展纳入C++23方面取得了一些进展-请参见https://github.com/cplusplus/papers/issues/18和https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0901r5.html。 - Bruce Adams

2
我认为realloc()不是STL分配器接口的一部分。但是realloc()总是一个赌博,因为您真的不知道您的操作系统是否会扩展您的分配或将您移动到新的分配。实际性能取决于操作系统。如果您知道您想要重新分配,那么最好提前分配更大的内存块,幸运的是STL使这很容易。
您有使用情况不希望这样吗?

在自定义分配器中,例如简单的区域分配器中,这是可取的。目前,如果您支持像std::vector这样的容器,则需要浪费至少预先分配的内存的一半。 - ciechowoj
我同意但想在这里补充一些内容。如果你为一个大的向量预留比你需要的更多的内存,那么你并没有浪费内存。你只是浪费了虚拟内存,如果你不过度使用的话,这也是可以接受的。但对于小的向量来说就不行了,因为虚拟内存是以4k字节页的块进行管理的。 - Patrick Fromberg

0

你可以在你保存在std::vector中的结构体中放置一个bool标志,以指示它是否已逻辑删除。要删除元素,请将此标志设置为true,但不要物理删除它。要重新分配元素,请查找一个真正的标志,将其设置为false以显示未删除,并使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接