重寫STL中的vector的內存配置器

Vector在創建時接受的參數

在c++STL中,容器類vector實際上在創建時可以接收兩個參數,第一個是存儲的元素的類型,第二個是內存配置器,第二個參數有默認值,但我們可以覆蓋這個默認值,但是默認值的覆蓋需要遵守一些規則,而這些規則則是本文的要講述的。

創建時添加第二參數:std::vector<int, my::allocator<int>> iv; //創建一個元素類型爲int,內存配置器爲my空間下的allocator<int>類

簡易內存配置器

#include <cstddef>
#include <cstdlib>
#include <climits>

namespace my{
	template<class T>
	class allocator{
	public:
		//以下的 typedef 是必須的,因爲在容器中有類似 _alloc::pointer 的語法 
		typedef T 			value_type;
		typedef T* 			pointer;
		typedef const T*	const_pointer;
		typedef const T& 	const_reference;
		typedef T&			reference;
		typedef size_t		size_type;
		typedef ptrdiff_t	difference_type;
		
		//rebind, 一般情況下似乎可以去掉,暫不知道在什麼場景下使用 
		template <class U>
		struct rebind{
			typedef allocator<U> other;
		};
	
		//以下全部的方法都可無,而這取決於容器執行了什麼操作
		pointer allocate(size_type n, const void * hint = 0){
			return (T*)malloc(n * sizeof(T)); 
			//return (T*)(::operator new((size_t)(size * sizeof(T))));
		}
		
		void deallocate(pointer p, size_type n){
			delete(p);
			//free(p);
		}
		
		void construct(pointer p, const T& value){
			new(p) T(value);
		}
		
		void destroy(pointer p){
			p->~T();
		}
		
		pointer address(reference x){
			return (pointer)&x;
		}
		
		const_pointer const_address(const_reference x){
			return (const_pointer)&x;
		}
		
		size_type max_size() const {
			return size_type(UINT_MAX/sizeof(T));
		} 
		
	};
	
} 


//簡易測試
#include <iostream>
#include <vector>
using namespace std;
int main(){
	int a[5] = {1,2,3,4,5};
	std::vector<int, my::allocator<int>> iv(a, a+5);
	iv.push_back(1);
	for(int i = 0; i < 6; ++i)
		std::cout << iv[i] << std::endl;
}

 

內存配置器的接口

接口名 參數 返回值 功能
allocate

size_type  n 元素個數,

const void *p = 0 類型指針,似乎可以可無

pointer   分配可容納n個元素的空間
deallocate

pointer p  指向元素的指針,

size_type n 釋放的個數,其實在調用free時不需要

void 釋放空間
destroy pointer p 指向元素的指針 void 銷燬元素,
construct

pointer p,

const T& value

void 構造元素,但是不配置空間
address reference x pointer

獲取元素的地址相當於&x

const_address const_reference x const_pointer 獲取元素的地址,針對常量元素
max_size void size_type 可容的元素數量最大值
       


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章