【问题标题】:Is Postgres using memory context because of the limitation of C?Postgres是否因为C的限制而使用内存上下文?
【发布时间】:2019-12-10 01:17:14
【问题描述】:

Postgres uses memory context to manage its memory.

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

【问题讨论】:

  • postgres 自述文件不是已经解释了为什么他们添加了 mmgr 层:“内存上下文相对于普通使用 malloc/free 的主要优点是可以释放内存上下文的全部内容轻松,无需请求释放其中的每个单独的块。这比按块记账更快更可靠。"

标签: c++ c postgresql memory


【解决方案1】:

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

这种减少的释放成本(通常与减少执行分配的开销相结合)是region based memory management(此策略的通用术语)的全部要点。

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

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

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

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

【讨论】:

  • 我有时会在 C 程序中看到它,人们不想一直处理调用 free(p),所以他们使用某种“池”进行操作,然后丢弃整个事情,我什至看到了一些可以在“分配”时间使用“析构函数”指针来关闭文件、套接字等。不过,C++ 为堆栈变量调用析构函数会自动处理大部分内容。
  • @FireLancer:是的,C 的内存管理很烦人,所以从方便的角度来看,基于区域的管理在 C 中比在 C++ 中更有用。但是,如果您真的需要这种好处,它仍然会为 C++ 提供性能好处,只是很少的 C++ 代码对性能敏感。
  • 我认为内存上下文的杀手锏是减少了内存泄漏的危险。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2015-10-03
  • 1970-01-01
  • 2017-09-04
  • 2020-11-26
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多