下午好,我们正在尝试对Windows内存映射的缓存子系统进行简单的仿真。我们正在使用几种STL数据结构。


一个STL deque std::deque<Range>访问,它保存并记录有关最近使用的内存映射到最近使用的内存映射区域的信息。
一个STL集std::set<char *> range_pointer,它可能保存指向STL deque中元素的指针。


基本上,当我们从STL集中检索指向有效内存映射区域的指针时,我们想使用该指针以O(恒定时间)直接访问相应的元素双端队列。然后,我们希望将该双端队列元素移至STL双端队列的前端,以便可以在STL双端队列访问的前端找到后续的内存映射地址数组的请求。

从堆栈溢出我们知道,唯一保证连续地址的STL容器是STL向量。但是,每次从STL向量中移动元素时,都需要O(linear)时间才能将剩余的项目移动或存储到正确的位置,这可能会很昂贵。相反,从STL双端队列移动元素时,所有元素都必须在要移动的元素的两侧重新排列下一个和上一个指针。

我们想知道是否可以编写一种通过其地址访问STL双端队列元素的方法。尽管std :: allocator不能保证连续的STL双端队列地址,但也许我们可以使用自定义内存池分配器来获取大量的连续地址。

另外,BOOST或其他C ++框架是否实现了连续的双链表,它们提供了与STL双端队列一样的随机访问。 Range类保存有关每个缓存的内存映射区域的所有基本信息。Range类存储在std :: deque accessess成员变量中。谢谢。类Range如下所示:

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

最佳答案

而不是使用set来保存地址,而是包含地址和map迭代器的deque呢?

请注意,将元素从双端队列的中间移动到开始或结束将不会比对向量进行处理更快。您可能需要考虑使用list

07-24 09:44
查看更多