sgi stl 的配置器與眾不同,也與標準規範不同,其名稱是 alloc 而非 allocator ,而且不接受任何引數。
一、sgi標準的空間配置器,std::allocator
雖然 sgi 也定義有乙個符合部分標準、名為 allocator 的配置器,但 sgi 從未用過它,也不建議我們使用。主要原因是效率不佳,只把 c++ 的 ::operator new 和 ::operator delete 做一層薄薄的包裝而已。
// 我們不贊成包含此檔案,這是原始的 hp default allocator。提供它只是為了
// 回溯相容
// // do not use this file 不要使用這個檔案,除非你手上的容器是以舊式做法
// 完成----那就需要乙個擁有 hp-style inte***ce 的空間配置器。sgi stl 使用
// 不同的 allocator 介面。sgi-style allocators 不帶有任何與物件型別相關
// 的引數;他們只響應 void * 指標。此檔案並不包含於其他任何sgi stl標頭檔案
#ifndef defalloc_h
#define defalloc_h
#include #include #include #include #include #include // 如果記憶體分配失敗,則直接退出程式
template inline t* allocate(ptrdiff_t size, t*)
return tmp;
}template inline void deallocate(t* buffer)
// 標準的stl allocator介面
template class allocator
void deallocate(pointer p)
pointer address(reference x)
const_pointer const_address(const_reference x)
size_type init_page_size()
size_type max_size() const
};// 特化版本
class allocator;
#endif
二、sgi 特殊的空間配置器,std::alloc
一般而言,c++記憶體配置操作和釋放操作是這樣的:
class foo
foo *pf = new foo; // 配置記憶體,然後建構函式
delete pf; // 將物件析構,然後釋放記憶體
這其中的 new 算式內含兩階段操作:(1)呼叫 ::operator new 配置記憶體;(2)呼叫 foo::foo() 構造物件內容。delete 算式也內含兩階段操作:(1)呼叫 foo::~foo() 將物件析構;(2)呼叫::operator delete釋放記憶體。
stl allocator 將這兩階段操作區分開來。記憶體配置操作由 alloc::allocate() 負責,記憶體釋放操作由 alloc::deallocate() 負責;物件構造操作由 ::construct() 負責,物件析構操作由 ::destroy() 負責。
記憶體空間的配置/釋放與物件內容的構造/析構,分別著落在和這兩個檔案身上。此外還有乙個檔案,這裡定義了一些全域性函式,用來填充(fill)或複製(copy)大塊記憶體資料,它們也都隸屬於stl標準規範:
un_initialized_copy()
un_initialized_fill()
un_initialized_fill_n()
STL原始碼剖析 空間配置器
看過stl空間配置器的原始碼,總結一下 1 stl空間配置器 主要分三個檔案實現,stl construct.h 這裡定義了全域性函式construct 和destroy 負責物件的構造和析構。stl alloc.h檔案中定義了 一 二兩級配置器,彼此合作,配置器名為alloc.stl uninit...
STL原始碼剖析 空間配置器
allocator是空間配置器而不是記憶體配置器,空間不一定是記憶體,也可以是磁碟或其他輔助儲存介質。但sgi stl提供的配置器配置的物件是記憶體。sgi標準的空間配置器,std alloctor sgi定義了乙個符合部分標準,名為alloctor的配置器,效率不高,只把c 的 operator ...
stl記憶體池剖析空間配置器
原 參考stl庫 具體只有記憶體分配 類似於c 的newhander 部分 沒有列出 stl空間配置器的記憶體池模型 pragma once include include include using namespace std class mallocalloctemplate 定義一級空間配置器...