除了堆栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储? [复制]
Posted
技术标签:
【中文标题】除了堆栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储? [复制]【英文标题】:What other forms of automatic and dynamic storage have been implemented for C++ other than the stack and heap model? [duplicate] 【发布时间】:2016-10-06 00:03:06 【问题描述】:在 C++ 规范中,术语“自动”和“动态”存储可以说分别优于“堆栈”和“堆”,因为 C++ 规范不要求使用堆栈/堆模型专门实现分配/解除分配。
除了堆栈和堆之外,还有其他分配/解除分配模型吗?
【问题讨论】:
对我来说,这似乎是 Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management? 的近似副本,但留给其他人。不希望它在我关闭后重新打开。 我觉得这个问题太含糊了:您是否将垃圾收集器视为内存管理的替代模型? 这似乎是两个独立的问题:一个是关于术语的意见,应该关闭,另一个是关于分配方案的技术。可以去掉术语部分吗? 静态分配是另一种最有可能用于内存分配的模型,它可以在程序的整个生命周期内保持有效。例如:全局变量。 【参考方案1】:在分配器(幸运与否)方面进行了大量研究,具有不同的内存布局、隔离等。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
)分配内存块。
因此,根据对象的类型,您可以使用不同的分配策略(还有一个基于堆栈的分配器可供选择)。
【讨论】:
关于“还有一个基于堆栈的分配器可供选择”,我怀疑std::allocator
是否可以从机器堆栈中分配。一个问题是它的分配函数的调用,以及调用它的调用,等等,使用机器堆栈。在 C++ 中至少有一个关于可变参数数组的提议(比非标准更安全一点,而且不是很便携alloca
),但我认为它需要编译器支持。
无论如何,小对象分配器在 Andrei 现在的经典著作《现代 C++ 设计》中进行了讨论,因此几乎可以肯定是 Loki library 的一部分。我认为提及这一点并进行链接会很好。 ;-)
@Cheersandhth.-Alf - 视频中提出的想法是完全放弃 std::allocator,并在代码中更简单,StackAllocator 是一个带有字符缓冲区的简单模板。观看视频:36:02。它当然是编译时的,不像 C 类的可变参数数组。【参考方案2】:
术语意见似乎基于错误的假设。
关于分配方案,很难理解您所说的“堆”是什么意思,但如果您指的是动态分配对象的显式释放,那么 C++ 从未正式要求这样做。当垃圾收集在 C++11 中获得一些支持时,那是因为它已经是经过验证的技术,例如Boehm garbage collector 用于 C++03。
C++ 确实需要并且一直需要一个堆栈,但不需要该堆栈的任何特定实现。通过细粒度的协作多任务处理,我们可能会看到使用基于链表的堆栈的实现。不过,截至 medio 2016,我还不知道。
【讨论】:
C++ 确实需要并且一直需要堆栈您是在谈论内存堆栈还是std::stack
?
@NathanOliver:内存堆栈。没有堆栈就不能拥有通用递归函数。因此标准使用了“堆栈”一词。 ;-)
很难理解你所说的“堆”是什么意思 > 很可能是用于在...中分配动态对象的内存区域
@Niall:我同意通常“堆”的意思,但在这个问题的上下文中它没有多大意义,作为“分配/解除分配的模型”。如果 OP 确实 意味着那我应该提到静态生命周期?
我真的不明白“模型”部分是什么,也许他想知道除了“经典”堆栈和堆之外是否还有其他自动和动态内存实现 - 而这个带我回到我的装配工时代。以上是关于除了堆栈和堆模型之外,C++ 还实现了哪些其他形式的自动和动态存储? [复制]的主要内容,如果未能解决你的问题,请参考以下文章