【发布时间】:2021-12-27 05:37:36
【问题描述】:
首先,我知道大多数现代软件都具有“限制内存使用量”等特定部分的功能。该软件可能使用OS-level API 或memory 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&);
}
我的问题是:
- 如何知道
ComplexStructure的准确内存使用情况?当然,100% 的准确率是不可能的,但至少我们应该能够统计new运算符分配的字节数,对吧? - 如何以某种方式将
ComplexStructure“链接”到这个“缓冲区”(注意可能有多个缓冲区,因此不能使用全局参数),以便在调用generate或delete方法时,他们可以更新size成员变量并知道缓冲区是否已满?
目前我唯一的解决方案是在ComplexStructure 中声明const size_t& max_size 和size_t& size。生成或删除数据时,使用sizeof 和# of items 来估计内存使用情况。这个解决方案非常丑陋而且非常不准确,不应该这样。
额外的解决方案可能是以某种方式“挂钩”每个 STL 容器中使用的分配器,这样每当它们分配内存时,我们就可以知道实际大小。但是不知道怎么实现。
似乎不仅c++,所有编程语言都没有这种特性。应该是哪里出了问题,是这种需求这么稀少,还是我的设计彻底坏了?
【问题讨论】:
-
您可以为容器提供自己的分配器。 Boost.Pool 提供了一些选项。你说几次你不知道该怎么做。如果您有兴趣这样做,那么您有机会进行一些研究并了解如何做。
标签: c++ memory memory-management architecture