假设我有一个很大的std::map< unsigned int, Foo > FooDB
,它将Foo
对象保存在内存中,可以通过其ID进行检索。现在Foo
对象的数量可能超过了可用于存储它们的内存。所以我想有以下构造:
Foo
FooDB
对象FooDB
中,则将其返回FooDB
中以供进一步查询FooDB
FooDB
对象中删除一些空间(最早的查询时间戳)我想为
FooDB
保留一些内存,但我不知道可以在其中存储多少个Foo
对象,因为它们的大小不同。关于如何实现这一点的任何想法?
编辑
我的基本问题是:如何知道
std::map
在内存中的大小?当然,其中存储的所有堆对象都包括在内。我怎么知道什么时候内存不足? 最佳答案
据我所知,除了sizeof()之外,没有办法询问对象的大小是多少。您说过sizeof()无效,因为Foo对象没有固定的大小。在那种情况下,如果您可以修改Foo,那么您的Foo类也许可以在内部跟踪其内存占用量。而且,如果您不能修改Foo,则可以编写一个可以推断出内存占用量的外部函数。
从根本上讲,语言/编译器/运行时将很难知道动态大小的对象有多大,因为它不知道哪个分配属于该对象。一个简单的解决方案,只需递归地将其成员指向的所有内容相加,就会在任何具有指向不属于“对象”的对象的指针的对象上失败。另一个简单的解决方案,即跟踪构造函数在启动时与返回之间之间所做的所有分配,对于在构造函数被调用后进行分配的任何操作都将失败。
您可能只想使用Foo的数量作为缓存限制,而不是使用内存大小。除非您对整个系统的内存可用性和使用情况了解很多,否则基于内存大小的上限也是任意的。而且,如果您对整个系统的内存使用了解很多,则可以使用整体内存可用性来确定何时从缓存中释放对象。