1. 程式人生 > >【STL】SGI空間配置器 Allocator

【STL】SGI空間配置器 Allocator

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

    if (bytes_left >= total_bytes) {  //情況1
    	//記憶體池剩餘空間完全滿足需求量
        result = start_free;
        start_free += total_bytes;
        return(result);
    } else if (bytes_left >= size) {  //情況2
    	//雖不足以完全滿足,但足夠供應一個(含)以上的區塊
    	//從start_free開始一共total_bytes分配出去,其中前size個bytes給客戶端,剩餘的給free-list
        nobjs = bytes_left/size;
        total_bytes = size * nobjs;
        result = start_free;
        start_free += total_bytes;
        return(result);
    } else {
    	//記憶體池剩餘空間連一個區塊的大小都無法提供
        size_t bytes_to_get = 2 * total_bytes + ROUND_UP(heap_size >> 4);
        // 以下嘗試將記憶體池中的殘餘零頭分配完
        if (bytes_left > 0) {
            obj * __VOLATILE * my_free_list =
                        free_list + FREELIST_INDEX(bytes_left); //找到大小相同區塊所在的free-list

            ((obj *)start_free) -> free_list_link = *my_free_list;  //將記憶體池剩餘空間編入free-list中
            *my_free_list = (obj *)start_free;
        }
        //此時記憶體池的空間已用完
        //配置heap空間,用來補充記憶體池
        start_free = (char *)malloc(bytes_to_get);
        if (0 == start_free) {
        	//heap空間不足,malloc失敗
            int i;
            obj * __VOLATILE * my_free_list, *p;
            //轉而從free-lists中找尋可用的區塊(其大小夠用)
            for (i = size; i <= __MAX_BYTES; i += __ALIGN) {
                my_free_list = free_list + FREELIST_INDEX(i);
                p = *my_free_list;
                if (0 != p) {   //free-list尚有可用區塊
                	//調整free-list以釋出可用區塊
                    *my_free_list = p -> free_list_link;
                    start_free = (char *)p;   //將改區塊歸還到記憶體池
                    end_free = start_free + i;
                    //再次從記憶體池中索要連續空間來滿足客戶端需求
                    return(chunk_alloc(size, nobjs));  //由於此時i >= size,故此次只會進入情況1/2
                }
            }
	    	end_free = 0;	//沒有可用區塊歸還到記憶體池,記憶體池仍為空
	    	//呼叫第一級配置器,看out-of-memory機制是否能改善
            start_free = (char *)malloc_alloc::allocate(bytes_to_get);
            
        }
        //記憶體池獲得新的連續空間
        heap_size += bytes_to_get;
        end_free = start_free + bytes_to_get;
        //再次嘗試分配
        return(chunk_alloc(size, nobjs));
    }
}

相關推薦

STLSGI空間配置 Allocator

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

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

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

STL原始碼——SGI 空間配置

本文主要參考STL原始碼剖析,但書中對某些地方寫的不是很詳細,所以根據個人的理解增加了一些細節的說明,便於回顧。 由於小型區塊分配時可能造成記憶體破碎問題,SGI設計了兩級配置器,第一級配置器直接使用malloc和free,第二級配置器則視情況採取不同的策略:當配置的區塊超

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

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

STL空間配置allocator詳解

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

STL 空間配置 allocator

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

C++STL 空間配置allocator

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

C++ 空間配置(allocator)

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

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

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

STL學習筆記——空間配置

一、STL基本概念1.基本元件   容器(Container)、演算法(Algorithm)、迭代器(Iterator)、仿函式(Functor)、容器介面卡(Adapter)、空間配置器(Allocator) 2.元件關係   容器通過空間配置器獲取資料儲存空間;演算法通

stl第二級空間配置詳解(1)

       SGI STL考慮到小型記憶體區塊的碎片問題,設計了雙層級配置器,第一級配置直接使用malloc()和free();第二級配置器則視情況採用不同的策略,當配置區大於128bytes時,直接呼叫第一級配置器;當配置區塊小於128bytes時,遍不借助第一級配置器,而使用一個memory pool來

STL——模擬實現空間配置

問題 我們在日常編寫C++程式時,常常會用到我們的STL標準庫來幫助我們解決問題,這當中我們用得最多估計就是它裡面的vector、list容器了,它們帶來的便利不用多說(畢竟OJ、刷題什麼的,基本全是它們的身影),而在日常學習中我們對STL中另一大元件—空間配置器 瞭解可能

空間配置——allocator

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

STL深入學習SGI STL空間配置詳解(二)-第二級空間配置

本文講解SGI STL空間配置器的第二級配置器。 相比第一級配置器,第二級配置器多了一些機制,避免小額區塊造成記憶體的碎片。不僅僅是碎片的問題,配置時的額外負擔也是一個大問題。因為區塊越小,額外負擔所佔的比例就越大。 額外負擔是指動態分配記憶體塊的時候,位於其頭部的額外資訊

[SGI STL]空間配置--記憶體管理

[SGI STL]系列文章前言        廢話不多說,讀侯捷的SGI STL原始碼分析目的有三個: 1,接觸c++不久就開始跟STL打交道,一直有個好奇心,這麼強大的庫到底是誰、咋實現的?; 2,不熟悉實現就用不好STL,所以想更好的應用STL,就有必要一探其底層驅

SGI STL空間配置-第一級空間配置

一、SGI STL配置器簡介 如果要了解STL的實現,必須要了解空間配置器,因為整個STL的操作物件都放在容器之內,而容器一定需要配置空間以存放資料等資料。allocator叫做空間配置器而不是記憶體配置器,因為空間不一定是記憶體,也可以是磁碟或者其他

SGI STL空間配置alloc

這兩天通過閱讀SGI  STL原始碼,與《STL原始碼剖析》上侯捷對於原始碼的非常好的講解與註釋,me理解了C++關於記憶體管理的具體實現方法,覺得大有所益。。。整理一下,將實現空間配置器所用的策略大致記錄下來。 1. STL容器簡介 STL提供了很多泛型容器,如v

SGI STL空間配置STL原始碼剖析)

空間配置器的標準介面(根據STL規範) allocator::value_typeallocator::pointerallocator::const_pointerallocator::referenceallocator::const_referencealloca

Java一臺服務配置多個Tomcat

shu 找到 通過 下載 ref connect 解決方案 .gz header 需求緣由 最近接收了一個新的工具業務:ipublish發布系統,剛接手這個業務的時候,發現每次發布新的代碼 需要到群裏告知大家,我要停服務幾分鐘,準備更新代碼啦。這尼瑪 哪個公司

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

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