假设我有一个很大的std::map< unsigned int, Foo > FooDB,它将Foo对象保存在内存中,可以通过其ID进行检索。现在Foo对象的数量可能超过了可用于存储它们的内存。所以我想有以下构造:

  • Foo
  • 中检索ID为x的FooDB对象
  • 如果对象x在FooDB中,则将其返回
  • 如果不是
  • ,请从HD加载它,然后尝试将其存储在FooDB中以供进一步查询
  • 有足够的可用内存:将其添加到FooDB
  • 内存不足:通过从未使用的FooDB对象中删除一些空间(最早的查询时间戳)

  • 我想为FooDB保留一些内存,但我不知道可以在其中存储多少个Foo对象,因为它们的大小不同。

    关于如何实现这一点的任何想法?

    编辑

    我的基本问题是:如何知道std::map在内存中的大小?当然,其中存储的所有堆对象都包括在内。我怎么知道什么时候内存不足?

    最佳答案

    据我所知,除了sizeof()之外,没有办法询问对象的大小是多少。您说过sizeof()无效,因为Foo对象没有固定的大小。在那种情况下,如果您可以修改Foo,那么您的Foo类也许可以在内部跟踪其内存占用量。而且,如果您不能修改Foo,则可以编写一个可以推断出内存占用量的外部函数。

    从根本上讲,语言/编译器/运行时将很难知道动态大小的对象有多大,因为它不知道哪个分配属于该对象。一个简单的解决方案,只需递归地将其成员指向的所有内容相加,就会在任何具有指向不属于“对象”的对象的指针的对象上失败。另一个简单的解决方案,即跟踪构造函数在启动时与返回之间之间所做的所有分配,对于在构造函数被调用后进行分配的任何操作都将失败。

    您可能只想使用Foo的数量作为缓存限制,而不是使用内存大小。除非您对整个系统的内存可用性和使用情况了解很多,否则基于内存大小的上限也是任意的。而且,如果您对整个系统的内存使用了解很多,则可以使用整体内存可用性来确定何时从缓存中释放对象。

    09-11 17:57