我有一个我作为练习编写的池分配器,它实现了 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/