c++ - 除了栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储?

标签 c++ memory-management dynamic-memory-allocation automatic-storage

<分区>

在 C++ 规范中,术语“自动”和“动态”存储可以说比“堆栈”和“堆”更可取,因为 C++ 规范不要求使用堆栈/堆模型专门实现分配/解除分配。

除了堆栈和堆之外,是否还有其他分配/释放模型?

最佳答案

已经对分配器(无论幸运与否)进行了大量研究,具有不同的内存布局、隔离等。Andrei Alexandrescu 撰写了关于这些的精彩演讲 CppCon 2015: Andrei Alexandrescu “std::allocator...” .您可能会发现它很有用。

他提供的其中一个例子可能会阐明一些可能性:

typedef Segregator<4096,
    Segregator<128,
        Freelist<Mallocator, 0, 128>,
        MediumAllocator>,
    Mallocator>
Allocator;

分配策略:

  • 如果对象小于 4096B:
    • 如果对象小于 128B,则使用 Freelist(元素批处理),
    • 否则使用 MediumAllocator(据说适合中型对象),
  • 否则使用 Mallocator(基于 malloc)分配内存块。

因此,根据对象的类型,您可以使用不同的分配策略(还有基于堆栈的分配器可供选择)。

关于c++ - 除了栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656427/

相关文章:

c - 更安全的重新分配方式

C : scanf skips the first iteration while taking char* inputs from user through scanf

c - 我是否在此 C 程序中正确释放内存?

c++ - 关于对象初始化语义的问题

c++ - 检测 Eigen 对象没有 eval() 成员的编译时解决方案?

ios - 减少弹出 VC 时释放 100 万个以上对象的时间

c - 编写 C 动态库 [DSOs] 的良好实践(二进制兼容性 + 内存管理)

c++ - QVariant 无法区分 QDateTime 和 QString

c++ - 在编译或初始化时对长数组进行编程初始化

c# - 如何在.NET中以编程方式测量当前进程的总内存消耗?