Postgres 是否因为 C 的限制而使用内存上下文?

Zho*_*hao 2 c c++ memory postgresql

Postgres 使用内存上下文来管理它的内存。

我能想到的这样做的一个好处是将所有内存分配划分到不同的上下文中,以便可以批量释放上下文中的分配。但是,我从未在 C++ 中遇到过类似的概念。是不是因为在 C++ 中有智能指针,因此不需要这样的上下文?如果 Postgres 是用 C++ 开发的,它会使用智能指针而不是内存上下文吗?

Sha*_*ger 5

C++ 智能指针没有提供这样的好处,因为它们仍然从根本上执行单独的释放(分配 n 个项目,执行 n 个释放),而这里的内存上下文允许批量释放(分配 n 个项目,执行 1 个释放)。

这种减少释放的成本(通常与减少执行分配的开销相结合)是基于区域的内存管理(此策略的通用术语)的重点。

C++ 代码可以使用这种策略,例如使用一个自定义分配器,它被引用计数并包含批量分配,每个子分配的删除器递减引用计数,当计数下降到零时批量分配被释放,但很难做到安全地做,特别是如果指针可能会无意中引用数据;C 更容易,因为所有这些指针都是显式的,确定何时应该发生构造函数/析构函数(它们不存在)等没有问题。

本质上,这是在非常特定的上下文中使用的一种技巧,其中所有涉及的指针要么在分配它们的区域内部,要么不涉及基于区域的管理。并试图将其扩展到现代 C++ 风格的智能指针和分配器会引入智能指针试图避免的相同复杂性,因此通常不值得打扰。

重点是,没有什么可以阻止C++ 这样做,但它很少需要(通常只在超高性能低级代码中),以至于大多数 C++ 代码都不会打扰。如果您正在编写真正需要此功能的 C++ 代码,则很有可能通过更直接的控制进行手动调整,从而使您无论如何都可以用 C 编写该特定组件。

C++ 确实稍微减少了对这种策略的需求,因为智能指针(很大程度上)消除了解除分配失败的风险(如 Postgres 文档所述,优点之一是它比按块簿记“更可靠”,表明它降低了泄漏的风险),所以 C 的好处多一点,但是 C 和 C++ 都受益于减少的开销(没有每个分配分配器的内存开销,没有为每次分配支付释放成本),所以 C++可以从区域中获益基于管理。

  • 我有时在 C 程序中看到它,人们不想一直调用 `free(p)`,所以他们使用某种“池”进行操作,然后丢弃整个东西,我什至看到一些可以在“分配”时使用“析构函数”函数指针来关闭文件、套接字等。C++ 调用堆栈变量的析构函数会自动处理大部分问题。 (3认同)
  • @FireLancer:是的,C 的内存管理很烦人,所以从方便的角度来看,基于区域的管理让你在 C 中比在 C++ 中获得更多。但如果您确实“需要”这种好处,它仍然会为 C++ 提供性能优势,只是很少有 C++ 代码对性能敏感。 (2认同)