【问题标题】:How can I implement an "Object Buffer" which can limit memory size?如何实现可以限制内存大小的“对象缓冲区”?
【发布时间】:2021-12-27 05:37:36
【问题描述】:

首先,我知道大多数现代软件都具有“限制内存使用量”等特定部分的功能。该软件可能使用OS-level APImemory pool 或其他我不知道的高级技术来实现此类功能。 但到目前为止,我正在写一个小程序,所以我想尽可能简单,这是我的问题:

假设我有一个包含一些复杂 STL 数据结构的类

class ComplexStructure {
private:
    std::map<AAA, BBB> struct1;
    std::vector<CCC> struct2;
    std::unordered_map<DDD, EEE> struct3;
public:
    void generate_some_data();
    void delete_some_data();
};

generate 方法可以在这些结构中插入一些数据,delete 方法可以从这些结构中删除一些数据。显然,它们可以改变内存使用情况。

现在我有一个专门用于存储ComplexStructure 的“缓冲区”类(也可以部分充当“工厂”)。它有一个max_size 来限制这些ComplexStructures 的字节数

class ComplexStructureBuffer {
private:
    size_t max_size;
    size_t size;
    std::list<ComplexStructure> list;
public:
    bool is_full();
    ComplexStructure& create(params...);
    void erase(ComplexStructure&);
}

我的问题是:

  1. 如何知道ComplexStructure的准确内存使用情况?当然,100% 的准确率是不可能的,但至少我们应该能够统计new 运算符分配的字节数,对吧?
  2. 如何以某种方式将ComplexStructure“链接”到这个“缓冲区”(注意可能有多个缓冲区,因此不能使用全局参数),以便在调用generatedelete 方法时,他们可以更新size成员变量并知道缓冲区是否已满?

目前我唯一的解决方案是在ComplexStructure 中声明const size_t&amp; max_sizesize_t&amp; size。生成或删除数据时,使用sizeof 和# of items 来估计内存使用情况。这个解决方案非常丑陋而且非常不准确,不应该这样。

额外的解决方案可能是以某种方式“挂钩”每个 STL 容器中使用的分配器,这样每当它们分配内存时,我们就可以知道实际大小。但是不知道怎么实现。

似乎不仅c++,所有编程语言都没有这种特性。应该是哪里出了问题,是这种需求这么稀少,还是我的设计彻底坏了?

【问题讨论】:

  • 您可以为容器提供自己的分配器。 Boost.Pool 提供了一些选项。你说几次你不知道该怎么做。如果您有兴趣这样做,那么您有机会进行一些研究并了解如何做。

标签: c++ memory memory-management architecture


【解决方案1】:
  1. 没有准确的方法来衡量内存使用情况。您可以使用 sizeof 运算符获取类型的确切大小,但这不会考虑可能动态分配的内容,例如容器的元素。

  2. 您不应该使用size 成员变量。大小已经存储在容器中,容器会为您保持更新。你应该只比较list.size()


对于限制内存的实际实现,我建议不要限制某些类型,而是一般的内存使用。在 C++ 中没有限制内存使用的标准方法,但操作系统确实提供了这样的功能。如果您希望限制程序一部分的内存使用,我建议您启动一个子进程,在那里运行该部分,并限制子进程的内存。 C++ 中没有创建子进程的标准方法。

【讨论】:

  • 感谢您的帮助!事实证明,测量某种类型的内存使用是不切实际的,我会尝试你的建议。顺便说一句,size 成员变量的意思是总字节数,而不是项目数。但当然不会再使用了。
猜你喜欢
  • 1970-01-01
  • 2014-10-28
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2020-09-03
相关资源
最近更新 更多