[英]How do i implement lazy initialization and caching in an immutable c++ object?
[英]How do I implement caching in C++?
假設,我有一個非常大的std::map< unsigned int, Foo > FooDB
,它在內存中保存Foo
對象,可以通過它們的ID檢索。 現在可能有更多的Foo
對象,而不是可用於存儲它們的內存。 所以我想要以下結構:
FooDB
檢索ID為x的 Foo
對象 FooDB
,則返回它 FooDB
以進行進一步查詢
FooDB
FooDB
使用的FooDB
對象中刪除一些空間(最早的查詢時間戳) 我想為FooDB
保留一些內存,我不知道,它們可以存儲多少個Foo
對象,因為它們的大小不同。
有關如何實現這一點的任何想法?
編輯
我的基本問題是:如何在內存中告訴std::map
的大小? 當然,包括存儲在其中的所有堆對象。 如何知道何時沒有達到足夠的內存部分?
據我所知,除了sizeof()之外,沒有辦法向對象詢問它的大小。 你說sizeof()不起作用,因為Foo對象沒有固定的大小。 在這種情況下,如果你可以修改Foo,那么你的Foo類可以在內部跟蹤它的內存占用。 如果你不能修改Foo,你可能能夠編寫一個可以減少內存占用的外部函數。
從根本上說,語言/編譯器/運行時很難知道動態大小的對象有多大,因為它不知道哪個分配屬於對象。 一個簡單的解決方案,只是遞歸地總結它的成員所指向的所有東西,對於任何指向它不“擁有”的對象的指針都會失敗。 另一個簡單的解決方案是跟蹤構造函數啟動和返回之間所做的所有分配,對於在調用構造函數之后進行分配的任何事情都將失敗。
您可能只想使用Foo的數量作為緩存限制而不是內存大小。 除非您對整個系統的內存可用性和使用情況了解很多,否則基於內存大小的上限也是任意的。 如果您對整個系統的內存使用情況了解很多,則可以使用整體內存可用性來確定何時從緩存中釋放對象。
這很簡單。
只需在FooDB中的每個內存中Foo實例的引用按年齡排序的排序鏈表中。
當您第一次將新項目加載到內存中時,將其添加到列表的前面。
當您讀取/修改項目時,將其從列表中間移動到列表的前面。
當您需要刪除舊項目以騰出空間時,請將其從列表背面彈出。
例如:
typedef shared_ptr<Foo> PFoo;
class Foo
{
...
list<PFoo>::iterator age;
};
typedef map< unsigned int, PFoo > FooDB;
FooDB foodb;
list<PFoo> ages;
void LoadFoo(PFoo foo)
{
ages.push_front(foo);
}
void ReadFoo(PFoo foo)
{
...
ages.erase(foo->age);
ages.push_front(foo);
}
void MakeSpace()
{
PFoo foo = ages.back();
ages.pop_back();
DeleteFoo(foo);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.