【问题标题】:C++ allocator to store objects of different types用于存储不同类型对象的 C++ 分配器
【发布时间】:2021-04-01 07:10:18
【问题描述】:

我有一堆由 unique_ptrs 包裹的对象。
每个对象都有自己的类型。
我想创建一种内存池来存储所有这些对象,以避免为每个最后一个对象进行堆分配。像这样:

分配器分配器(1024); // 应该是可扩展的
unique_ptr a = allocator.allocateAndWrapToUPtr();
unique_ptr b = allocator.allocateAndWrapToUPtr();
C* c = allocator.allocate();

据我所见,分配器被指定为
模板
类 MyAllocator;
因此它们只能存储一种类型的对象。

是否可以实现“多类型”分配器?

【问题讨论】:

  • “每个最后一个对象的堆分配”为您创建了哪些实际的具体问题?
  • 你有没有看过这样的东西:dmitrysoshnikov.com/compilers/writing-a-pool-allocator
  • 分配器不是 C++ 中最琐碎的部分,它们的使用主要被高级结构隐藏。您可以使用包含它们的向量的工厂类和将对象返回到池中的伪析构函数,而不是处理它们的血腥细节。如果你走分配器的方式,你必须知道对象分配器将默认用于子对象分配(例如字符串)。
  • 找到它,但它不符合 std::allocator 接口,因此我将无法在集合中使用它。没关系,只是想确保我不能将一件事用于我的 uptrs、收藏等。看起来方法是这样的:如果您需要多个对象类型的分配器 - 使用示例中的非模板分配器。如果您想使用分配器进行收集 - 使用具有 stl 兼容接口的模板化分配器。我只是认为我可以分配大量内存并将其用于代码中的所有内容。

标签: c++ memory-management dynamic-memory-allocation


【解决方案1】:

不可能在项目的各处都使用一个分配器。 动态分配器示例可以在 dmitrysoshnikov.com/compilers/writing-a-pool-allocator 找到,它允许使用 unique_ptrs 解决初始问题。
但它不符合 stl,因此不能用于集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多