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

标签 c++ c postgresql memory

Postgres uses memory context to manage its memory.

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

最佳答案

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

减少重新分配的成本(通常与减少执行分配的开销相结合)是 region based memory management 的重点(此策略的总称)。

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

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

要点是,没有什么能阻止 C++ 执行此操作,但它很少需要(通常仅在超高性能低级代码中),因此大多数 C++ 代码不会打扰。如果您正在编写确实需要此功能的 C++ 代码,那么它很有可能会受益于具有更直接控制的手动调整,从而导致您无论如何都要用 C 语言编写该特定组件。

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

关于c++ - Postgres 是否因为 C 的限制而使用内存上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258856/

相关文章:

c - MS Visual Studio 编译器提供哪些 C99 功能?

c++ - 如何找出我的 Linux 应用程序的内存占用情况?

sql - 是否可以访问 Postgres 中尚未清理的旧版本行?

mysql - 我是否应该进一步规范化多个表中使用的外键集?

python - 第二个插入不起作用,但第一个和第三个是

c++ - `contains` 的恒定时间 `std::vector` ?

c++ - 从监听器中检索 antlr4 解析器中跳过的空格

c++ - 是否可以从外部进程注入(inject)和执行应用程序?

c++ - "placement new"有什么用?

c - 在 C 中使用 fts_children() 的意外结果