1. 程式人生 > >設計一個簡單的空間配置器 JJ::allocator

設計一個簡單的空間配置器 JJ::allocator

#ifndef _JJALLOC_
#define _JJALLOC_


#include<new>//for placement new  
#include<cstdlib>//for ptrdiff_t,size_t  
#include<climits>//for UINT_MAX  
#include<iostream>//for cerr  
#include<vector>

using namespace std;


namespace JJ
{

	template<class T>
	inline T* _allocate(ptrdiff_t size, T*){
		//當operator new申請一個記憶體失敗的時候.  
		//如果存在客戶指定的處理函式,則呼叫處理函式(new_handler),如果不存在則丟擲一個異常  
		//引數為0,則丟擲異常  
		set_new_handler(0);
		T* tmp = (T*)(::operator new((size_t)(size*sizeof(T))));
		if (tmp == 0){
			cerr << "out of memory" << endl;
			exit(1);
		}
		return tmp;
	}

	template<class T>
	inline void _deallocate(T* buffer){
		::operator delete(buffer);
	}

	template<class T1, class T2>
	inline void _construct(T1*p, const T2& value){
		new(p)T1(value);
	}
	template<class T>
	inline void _destroy(T* ptr){
		ptr->~T();
	}

	template<class T>
	class allocator{
	public:
		typedef T           value_type;
		typedef T*          pointer;
		typedef const T*    const_pointer;
		typedef T&          reference;
		typedef const T&    const_reference;
		typedef size_t      size_type;
		typedef ptrdiff_t   difference_type;

		//rebind allocator of type U  
		template<class U>
		struct rebind{
			typedef allocator<U> other;
		};

		pointer allocate(size_type n, const void* hint = 0){
			return _allocate((difference_type)n, (pointer)0);
		}

		void deallocate(pointer p, size_type n) 
		{ 
			_deallocate(p);
		}

		void construct(pointer p, const T& value)
		{
			_construct(p, value);
		}

		void destroy(pointer p)
		{ 
			_destroy(p);
		}

		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));
		};
	};

} //end of namespace JJ  
#endif _JJALLOC_  


int main()
{
	int ia[] = { 1, 2, 3, 4, 5 };
	std::vector<int, JJ::allocator<int>>iv(ia, ia + 5);

	for (int i = 0; i < iv.size(); i++)
		cout << iv[i] << " ";
	cout << endl;
	return 0;
}


1.型別介紹:

size_t是unsigned型別,用於指明陣列長度或下標,它必須是一個正數,std::size_t

ptrdiff_t是signed型別,用於存放同一陣列中兩個指標之間的差距,它可以使負數,std::ptrdiff_t.

size_type是unsigned型別,表示容器中元素長度或者下標,vector<int>::size_type i = 0;

difference_type是signed型別,表示迭代器差距,vector<int>:: difference_type = iter1-iter2.

2.

當operator new申請一個記憶體失敗的時候,它會進行如下的處理步驟:
    1、如果存在客戶指定的處理函式,則呼叫處理函式(new_handler),如果不存在則丟擲一個異常

    2、繼續申請記憶體分配請求。
    3、判斷申請記憶體是否成功,如果成功則返回記憶體指標,如果失敗轉向處理步驟1

為了自定義這個“用以處理記憶體不足”的函式new_handler,使用者可以呼叫set_new_handler進行設定

這兩個函式宣告如下:

namespace std{

     typedef void (*new_handler)();

     new_handler set_new_handler(new_handler p) throw();

}

其中,new_handler是個typedef,定義一個函式指標,該函式沒有引數,也沒有返回值;

set_new_handler用於設定處理函式,設定p為當前處理函式,並返回之前的new_handler

當引數p為0時,即丟擲異常

相關推薦

設計一個簡單空間配置 JJ::allocator

#ifndef _JJALLOC_ #define _JJALLOC_ #include<new>//for placement new #include<cstdlib>//for ptrdiff_t,size_t #include&

c++設計一個簡單空間配置

#include <iostream> template<typename T> inline T* _allocate(unsigned int size,T*){//size     T *temp=static_cast<T*>(op

C++ 空間配置(allocator)

name 碎片 inux set 特性 改變 ptr comm 二級 C++ 空間配置器(allocator) 在STL中,Memory Allocator 處於最底層的位置,為一切的 Container 提供存儲服務,是一切其他組件的基石。對於一般使用 STL 的用戶

STL學習筆記(1)空間配置 allocator

1 簡述     STL其他元件都是存放在空間配置器配置的空間中,此處空間可以是記憶體,也可以是磁碟或其他輔助儲存介質。     allocator負責記憶體的分配和釋放,以及負責物件的構造和析構,兩個操作時分開的。     每個容器都已經制定了預設的空間配置器

STL空間配置allocator詳解

stl六大元件簡介 我們知道,stl有容器,空間配置器,介面卡,迭代器,仿函式以及演算法這6個元件,它們六者關係大概如下:容器通過配置器取得資料儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成不同的策略變化,配接器可以修飾或套界仿函式。 侯捷在《STL原始

C++ STL學習之 空間配置(allocator)

標籤(空格分隔): C++ STL 眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空

[C++] 空間配置——allocator

  1、new和delete有一些靈活性上的侷限:new把記憶體分配和物件構造組合在了一起;delete將物件析構和記憶體釋放組合在了一起。   2、當分配一大塊記憶體時,我們通常計劃在這塊記憶體上按需構造物件,在此情況下,我們希望 將記憶體分配和物件構造分離;這意

【STL】SGI空間配置 Allocator

//size此時已適當上調至8的倍數 template <bool threads, int inst> char* __default_alloc_template<threads, inst>::chunk_alloc(size_t size, int& nobjs) {

STL 空間配置 allocator

STL的操作物件(所有的數值)都存放在容器之中,而容器則需要配置空間以置放資料。最近在看侯捷的《STL原始碼剖析》,所以做了筆記。 為什麼不說allocator是記憶體配置器而說他是空間配置器呢? 因為空間不一定是記憶體,空間也可以是磁碟或其他輔助儲存介質

空間配置——allocator

主要介紹一下allocator的用法一、為什麼要有allocator為什麼會有allocator?原因是new在記憶體分配上面有一些侷限性,new的機制是將記憶體分配和物件構造組合在一起,同樣的,del

C++STL 空間配置allocator

先來介紹一下STL的六大元件1. 空間配置器:記憶體池實現小塊記憶體分配,對應到設計模式--單例模式(工具類,提供服務,一個程式只需要一個空間配置器即可),享元模式(小塊記憶體統一由記憶體池進行管理)2.迭代器:迭代器模式,模板方法3.容器:STL的核心之一,其他元件圍繞容器

Python學習-一個簡單的計時

pos var ota mar split dcl turn data 代碼 在實際開發中,往往想要計算一段代碼執行多長時間,以下我將該功能寫入到一個函數裏面,僅僅要在每一個函數前面調用該函數就可以,見以下代碼: #----------------

如何用Java編寫一個簡單的服務和客戶機

exce 解決 對賬 location exceptio acc 明顯 隊列 客戶 今天我要向大家介紹的是自己編寫的一個比較簡單的服務器和客戶機程序,註意一下哦,比較簡單。好了,閑話休提,砸門直入主題。 小編先從客戶機和服務器的模型開始講解。

一個簡單配置文件和日誌管理(shell)

客戶端 數據 時間 r+ socket編程 har stdout scan 語言 最近在做一個Linux系統方案的設計,寫了一個之前升級服務程序的配置和日誌管理。 共4個文件,服務端一個UpdateServer.conf配置文件和一個UpdateServer腳本,客戶端一個

使用redis設計一個簡單的分布式鎖

睡眠狀態 環境 是否 lease 驗證 pri 嘗試 lee 功能 最近看了有關redis的一些東西,了解了redis的一下命令,就記錄一下: redis中的setnx命令: 關於redis的操作命令,我們一般會使用set,get等一系列操作,數據結構也有很多,這裏我們使用

C++標準庫——STL之空間配置

但是 chunk 內容 既然 部分 如何 標識 stl源碼 strong 聲明:源碼同《STL源碼剖析》(侯捷) STL:   C++標準的模板庫,通用性高。   常見的數據結構封裝。   提供常用的通用算法。 STL六大組件:   容器 算法 叠

通過MFC設計一個簡單的計價程序

cte tro 下一個 基於 一次 靜態 splay 進行 dal 1、實驗目的   掌握使用MFC應用程序向導創建應用程序的方法。   掌握新建對話框資源的方法。   掌握生成對話框的方法。 2、實驗內容   用應用程序創建一個默認的對話框應用程序,在對話框中能進入下一個

[SimplePlayer] 實現一個簡單的播放

false rip 音頻 class sam 文件中 多線程處理 設備 pos 簡單的播放器需要實現一個最基本的功能:播放視頻文件。 實現這個功能需要包含以下幾個步驟: 從視頻文件中提取視頻圖像 在屏幕上顯示視頻圖像 視頻幀的同步,也就是保證視頻圖像在合適的時間在屏幕

空間配置

技術 準備 inf alloc opened img lose 找到 isp 1 void* __default_alloc::allocate(size_t n) 2 { 3 obj* volatile *my_free_list;

SGISTL原始碼閱讀一 空間配置上(第一級配置

SGISTL原始碼閱讀一 空間配置器上(第一級配置器) 引入 我們所熟知的C++記憶體配置操作一般為 class A {} A* pa = new A(); //1.分配記憶體 2.構造物件 delete pa; //1.物件析構 2.釋放記憶體 其中new完成了兩