下午好,我们正在尝试对Windows内存映射缓存子系统进行简单的仿真。我们正在使用几种STL数据结构。
std::deque<Range>
访问,它保存并记录最近最近使用的最近使用的内存映射区域的信息。std::set<char *>
ranges_pointer,它可能包含指向STL deque
中元素的指针。基本上,当我们从STL集中检索指向有效内存映射区域的指针时,我们希望使用该指针直接访问O中的相应元素deque(常量时间)。然后,我们想将该deque元素移动到STL双端队列的前面,以便可以在STL deque访问的前面找到后续的内存映射addreses集群的命令。
我们从Stack Overflow了解到,唯一保证具有相同地址的STL容器是STL向量。但是,每次从STL向量移动元素时,需要O(线性)时间来将剩余项目移位或记忆到正确的位置,这可能很昂贵。相反,当您从STL双端队列移动元素时,所有人都必须重新排列移动元素两侧的next和prev指针。
我们想知道是否可以通过其地址编写访问STL deque元素的方法。虽然std :: allocator不保证连续的STL deque地址,但也许我们可以使用自定义内存池分配器来获取一块连续的地址。
此外,BOOST或其他C ++框架实现了连续的双向链表,它们提供随机访问,就像STL deque一样。 Range类保存有关每个缓存的内存映射区域的所有基本信息。类Range存储在std :: deque accessess成员变量中。谢谢。类范围如下所示:
class Range {
public:
explicit Range(int item){
mLow = item;
mHigh = item;
mPtr = 0;
mMapPtr = 0;
}
Range(int low, int high, char* ptr = 0,char* mapptr = 0,
int currMappedLength = 0){
mLow = low;
mHigh = high;
mPtr = ptr;
mMapPtr = mapptr;
mMappedLength = currMappedLength;
}
Range(void){
mLow = 0;
mHigh = 0;
mPtr = 0;
mMapPtr = 0;
}
~Range(){
}
bool operator<(const Range& rhs) const{
return mHigh < rhs.mHigh;
}
int low() const { return mLow; }
int high() const { return mHigh; }
char* getMapPtr() const { return mMapPtr; }
int getMappedLength() const { return mMappedLength; }
private:
int mLow; // beginning of memory mapped region
int mHigh; // end of memory mapped region
char* mMapPtr; // return value from MapViewOfFile
int mMappedLength; // length of memory mapped region
}; // class Range
答案 0 :(得分:3)
而不是使用set
来保存地址,包含地址的map
和deque
中的迭代器怎么样?
请注意,将元素从双端队列中间移动到开头或结尾并不比向量处理要快。您可能想要考虑使用list
。