《STL剖析》 空間配置器(一)

2021-06-20 13:13:57 字數 1832 閱讀 9559

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 定義一級空間配置器...