Добрый день, мы пытаемся сделать простую эмуляцию подсистемы кэширования памяти Windows.Мы используем несколько структур данных STL.
- Deque STL,
std::deque<Range>
осуществляет доступ, в котором хранится и записывается информация о последних недавно использованных в недавно использованных областях отображения памяти. - Набор 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