Ben*_*Ben 5 c++ caching memory-management
假设,我有一个非常大的std::map< unsigned int, Foo > FooDB,它将Foo对象保存在内存中,可以通过它们的ID检索.现在可能有更多的Foo对象,而不是可用于存储它们的内存.所以我想要以下结构:
Foo对象,具有ID X从FooDBFooDB,则返回它FooDB供进一步查询
FooDBFooDB从未使用的对象中删除一些空间(最早的查询时间戳)我想保留一些内存FooDB,我不知道,Foo它可以存储多少个对象,因为它们的大小不同.
有关如何实现这一点的任何想法?
编辑
我的基本问题是:如何判断std::map内存中的大小?当然,包括存储在其中的所有堆对象.如何知道何时没有达到足够的内存部分?
据我所知,除了sizeof()之外,没有办法向对象询问它的大小.你说sizeof()不起作用,因为Foo对象没有固定的大小.在这种情况下,如果你可以修改Foo,那么你的Foo类可以在内部跟踪它的内存占用.如果你不能修改Foo,你可能能够编写一个可以减少内存占用的外部函数.
从根本上说,语言/编译器/运行时很难知道动态大小的对象有多大,因为它不知道哪个分配属于对象.一个简单的解决方案,只是递归地总结它的成员所指向的所有东西,对于任何指向它不"拥有"的对象的指针都会失败.另一个简单的解决方案是跟踪构造函数启动和返回之间所做的所有分配,对于在调用构造函数之后进行分配的任何事情都将失败.
您可能只想使用Foo的数量作为缓存限制而不是内存大小.除非您对整个系统的内存可用性和使用情况了解很多,否则基于内存大小的上限也是任意的.如果您对整个系统的内存使用情况了解很多,则可以使用整体内存可用性来确定何时从缓存中释放对象.