c++ - 使固定大小的 block 池分配器适应某些 STL 容器

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

我有一个我作为练习编写的池分配器,它实现了 C++11 std::allocator 要求并运行它工作正常,但我用作引用的策略(基于以下论文):

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

仅适用于一次将单个对象分配到一个足够大的内存块中。

我注意到 std::allocator 模板方法“allocate”有一个参数,其中 STL 容器可以请求同时分配的 block 数。例如,它看起来像 std::basic_string,一旦它超过一定大小的字符串,它就会保留在堆栈中,通过从分配器请求足够大的连续内存块来存储一个 char 数组,立即将整个字符串移到堆中持有整个字符串。 std::vector 的动态扩展似乎以类似的方式工作。

有没有什么方法可以使分配器适应这种类型的 STL 容器,该分配器旨在返回固定大小的 block ,其大小与模板化的类型相同?

最佳答案

你可以沿着这条路走:

On the other hand, multiple instances of numerous fixed-sized
pools can be used to produce a general overall flexible
general solution to work in place of the current system
memory manager.

并将每个不同大小的请求视为对新池的请求,即您的“对象大小”实际上是对象*计数。 你会烧掉很多内存。 您可以为数组大小设置一个上限,然后回退到高于该上限的默认通用分配。

关于c++ - 使固定大小的 block 池分配器适应某些 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46850252/

相关文章:

c++ - 是否可以在其范围之外访问局部变量的内存?

c++ - 如何强制 GCC 以线性方式转换 volatile 内联汇编语句?

java - 在C++应用程序中嵌入Java时,需要带哪些文件?

c++11 - 如何处理由空模板参数包扩展引起的未使用警告?

c++ - 系统地包装纯虚类

c++ - 在虚析构函数中调用其他虚方法是否安全?

memory - Linux下如何给进程分配更多内存

javascript - 如何在 Javascript 中释放前一个堆栈帧的内存

c++ - Boost 单元测试内存重用导致本应无法通过的测试

c++ - C++ 中缺少标准化命名约定 "standard"