Можно ли получить доступ к элементу deque STL по его адресу? - PullRequest
0 голосов
/ 28 июня 2011

Добрый день, мы пытаемся сделать простую эмуляцию подсистемы кэширования памяти Windows.Мы используем несколько структур данных STL.

  1. Deque STL, std::deque<Range> осуществляет доступ, в котором хранится и записывается информация о последних недавно использованных в недавно использованных областях отображения памяти.
  2. Набор STL, std::set<char *> range_pointer, который может содержать указатели на элементы в STL deque ..

В основном, когда мы получаем указатель на действительную отображенную область памяти из набора STL, мы хотели бы использовать этот указатель для прямого доступа к соответствующему элементу deque в O (постоянное время).Затем мы хотели бы переместить этот элемент deque в начало deque STL, чтобы последующие запросы для кластеров отображенных в памяти адресов могли быть найдены в начале доступа к deque STL.

Мы знаем из стекаПереполнение, что единственным контейнером STL, который гарантирует случайные адреса, является вектор STL.Однако каждый раз, когда кто-либо перемещает элемент из вектора STL, требуется O (линейное) время, чтобы сдвинуть или записать оставшиеся элементы в нужное место. Это может быть дорого.Напротив, когда вы перемещаете элемент из очереди STL, все должны переставить следующий и предыдущий указатели с обеих сторон перемещаемого элемента.

Нам было интересно, можно ли написать метод для доступа кSTL deque элемент по его адресу.Хотя std :: allocator не гарантирует непрерывные адреса блокировки STL, возможно, мы могли бы использовать собственный распределитель пула памяти для получения фрагмента непрерывных адресов.

Кроме того, в BOOST или других C ++ каркасах реализованы непрерывные двусвязные спискикоторые предлагают произвольный доступ, как и STL deque.Класс 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 

1 Ответ

3 голосов
/ 28 июня 2011

Вместо использования set для хранения адресов, как насчет map, который содержит адрес и итератор в deque?

Обратите внимание, что перемещение элемента из середины deque в начало или конец будет происходить не быстрее, чем для вектора. Вы можете подумать об использовании list.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...