我认为这样做的一个好处是将所有内存分配划分为不同的上下文,这样就可以大量释放上下文中的分配。然而,在C++中,我从未遇到过类似的概念。是因为在C++中有智能指针,因此不需要这样的上下文吗?如果Postgres是用C++开发的,它会使用智能指针而不是内存上下文吗?
发布于 2019-12-10 01:31:35
C++智能指针没有提供这样的好处,因为它们仍然从根本上执行单个释放(分配n个项,执行n个释放),而这里的内存上下文允许批量去分配(分配n个项,执行1个去分配)。
这种减少的分配成本(通常与执行分配的开销减少相结合)是基于区域的内存管理 (此策略的通用术语)的全部要点。
C++代码可以使用此策略,例如,使用一个自定义分配器,该分配器包含批量分配,每个子分配的删除器将减少引用计数,当计数降至零时批量分配将大量释放,但安全地执行此策略很困难,特别是如果指针可能无意中引用数据;C更容易,因为所有这些指针都是显式的,因此确定何时应该发生构造函数/析构函数(它们不存在)没有问题,等等。
本质上,这是在非常具体的上下文中使用的一种技巧,在这种情况下,所涉及的所有指针要么是分配给它们的区域的内部指针,要么不涉及基于区域的管理。并且试图将其扩展到现代C++风格的智能指针和分配器,引入了智能指针试图避免的相同的复杂性,因此通常不值得操心。
重点是,没有什么能阻止C++这样做,但是很少需要它(通常只在超高性能的低级别代码中),所以大多数C++代码都不会麻烦。如果您正在编写真正需要此功能的C++代码,那么它很有可能受益于使用更直接的控制进行手工调优,从而导致您用C编写特定组件。
C++确实稍微减少了对这种策略的需求,因为智能指针(很大程度上)消除了失败的风险(正如Postgres博士所指出的,它的一个优点是它比每块簿记更“可靠”,这表明它降低了泄漏的风险),所以C受益更多,但是C和C++都受益于减少的开销(没有每个分配分配器内存开销,没有为每次分配支付降低分配成本),因此C++可以从基于区域的管理中获益。
https://stackoverflow.com/questions/59258856
复制相似问题