SGI STL空間介面卡freelist設計
今天重新看了《STL原始碼剖析》,不禁要讚歎STL設計的經典。STL 的空間適配程式碼設計的尤為精闢,不僅考慮到記憶體碎片的隱患,而且考慮到指標空間的節儉和複用,降低維護連結串列(lists)帶來額外的負擔。我們來看看如下程式碼;
先看看STL的結構體,
union obj{
union obj *free_list_link;
char clent_data[1]; /* the client sees this */
};
obj 之所以用union,由於union之故,從其第一個欄位觀之,obj可被視為一個指標,指向相同形式的另一個obj。從其第二個欄位觀之,obj可被視為一個指標,指向實際區域。一物二用的結果是,不會為了維護連結串列所必須的指標而造成記憶體的另一種讓費。
看看如下示例程式碼,你就發現它的設計精妙之處!
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; union obj{ union obj *free_list_link; char clent_data[1]; /* the client sees this */ }; int main() { obj *op1 = (obj *)malloc(32); strcpy(op1->clent_data,"hello free!"); obj *op2 = (obj *)malloc(32); op2->free_list_link = NULL; obj *op3 = (obj *)malloc(32); strcpy(op3->clent_data,"hello free l"); printf("----------------------------------------\r\n"); printf("address freelist:%ld\r\n",(long)(op3->free_list_link)); printf("address clentdata:%ld\r\n",(long)&(op3->clent_data)); obj *op4 = (obj *)malloc(32); op4->free_list_link = op2; obj *op5 = (obj *)malloc(32); op5->free_list_link = op4; printf("----------------------------------------\r\n"); obj *begin = op5; while(begin){ printf("%ld\r\n",(long)begin); begin = begin->free_list_link; } /* release op3 */ op2->free_list_link = op3; op3->free_list_link = NULL; printf("----------------------------------------\r\n"); printf("address freelist:%ld\r\n",(long)(op3->free_list_link)); printf("address clentdata:%ld\r\n",(long)&(op3->clent_data)); printf("----------------------------------------\r\n"); begin = op5; while(begin){ printf("begin:%ld\r\n",(long)begin); begin = begin->free_list_link; } return 0; }
輸出如下:
----------------------------------------
address freelist:1819043176
address clentdata:143143000
----------------------------------------
143143080
143143040
143142960
----------------------------------------
address freelist:0
address clentdata:143143000
----------------------------------------
begin:143143080
begin:143143040
begin:143142960
begin:143143000
相關推薦
SGI STL空間介面卡freelist設計
今天重新看了《STL原始碼剖析》,不禁要讚歎STL設計的經典。STL 的空間適配程式碼設計的尤為精闢,不僅考慮到記憶體碎片的隱患,而且考慮到指標空間的節儉和複用,降低維護連結串列(lists)帶來額外的負擔。我們來看看如下程式碼;先看看STL的結構體,union obj{
深度解析--SGI STL 空間配置與釋放
歡迎大家來訪二笙的小房子,一同學習分享生活! 文章目錄 1.SGI 空間配置與釋放 2. 兩級配置器 2.1 一、二級配置器的關係 2.2 第一級配置器 __malloc_alloc_template 2.3 第二級配置器
[SGI STL]空間配置器--記憶體管理
[SGI STL]系列文章前言 廢話不多說,讀侯捷的SGI STL原始碼分析目的有三個: 1,接觸c++不久就開始跟STL打交道,一直有個好奇心,這麼強大的庫到底是誰、咋實現的?; 2,不熟悉實現就用不好STL,所以想更好的應用STL,就有必要一探其底層驅
SGI STL空間配置器-第一級空間配置器
一、SGI STL配置器簡介 如果要了解STL的實現,必須要了解空間配置器,因為整個STL的操作物件都放在容器之內,而容器一定需要配置空間以存放資料等資料。allocator叫做空間配置器而不是記憶體配置器,因為空間不一定是記憶體,也可以是磁碟或者其他
【STL深入學習】SGI STL空間配置器詳解(二)-第二級空間配置器
本文講解SGI STL空間配置器的第二級配置器。 相比第一級配置器,第二級配置器多了一些機制,避免小額區塊造成記憶體的碎片。不僅僅是碎片的問題,配置時的額外負擔也是一個大問題。因為區塊越小,額外負擔所佔的比例就越大。 額外負擔是指動態分配記憶體塊的時候,位於其頭部的額外資訊
SGI STL空間配置器(STL原始碼剖析)
空間配置器的標準介面(根據STL規範) allocator::value_typeallocator::pointerallocator::const_pointerallocator::referenceallocator::const_referencealloca
SGI STL的空間配置器alloc
這兩天通過閱讀SGI STL原始碼,與《STL原始碼剖析》上侯捷對於原始碼的非常好的講解與註釋,me理解了C++關於記憶體管理的具體實現方法,覺得大有所益。。。整理一下,將實現空間配置器所用的策略大致記錄下來。 1. STL容器簡介 STL提供了很多泛型容器,如v
SGI STL內存配置器存在內存泄漏嗎?
析構 溫故而知新 溫故 由於 默認 文件路徑 htm .com 成員 閱讀了SGI的源碼後對STL很是膜拜,很高質量的源碼,從中學到了很多。溫故而知新!下文中所有STL如無特殊說明均指SGI版本實現。 STL 內存配置器 STL對內存管理最核心部分我覺得是其將C++對象創建
SGI STL內存配置器(一):內存泄漏?
分解 產生 for void 客戶端 lin call free 創建過程 閱讀了Alexander大神的SGI STL源碼,膜拜,很高質量的源碼,獲益匪淺。溫故而知新!下文中所有STL如無特殊說明均指SGI版本實現。 STL 內存配置器 STL對內存管理最核心部分我覺得是
6自由度空間機器人課程設計的簡要記錄
*** n) power height 開始 代碼風格 一行 0.10 分析 這個空間機器人的課設是在學期末的時候已經完成,現在在假期有時間正好做一下簡要的總結和記錄。另外最後一題僅僅是給出了思路(利用遺傳算法 或是 粒子群算法),最終在代碼實現方面並未完成,當時時間也比較
swift 名稱空間實現的設計思考:extension YKKit where Base == String
設計問題:誰來構造、構造什麼、怎麼新增新功能 關鍵詞:本體、客體、構造、對映、功能。 別名:橋接變數、型變變數、容器變數、適配變數,構造變數; 目的:新增名稱空間、新增新功能。 原則:不修改本體的實現。 原始版本: 在本體的擴充套件中,直接構造客體;客體的構造器輸入
vector容器,迭代器,空間介面卡三個類方法的實現
C++的STL庫有一個容器叫vector,這個容器底層的資料結構是一個記憶體可以自動增長的陣列,每次當陣列儲存滿了以後,記憶體可以自動增加兩倍,請完成vector容器、迭代器和空間配置器三個類方法的實現。 #include<iostream> using namespace
SGI STL Sort演算法
Sort stl所提供的各式各樣的演算法中,sort()是最複雜龐大的一個。這個演算法接受兩個隨機存取迭代器,然後將區間內的所有元素以漸增方式由小到大重新排列。還有個版本則允許使用者指定一個仿函式,作為排序標準。 stl中的所有關係型容器都擁有自動排序功能,所以不需要sort演算法。序列
STL空間配置器篇
零、為何STL要單獨設計空間配置器? 一開始我有過這樣的疑惑:為什麼STL不直接使用malloc和free操縱記憶體即可,為什麼還要設計空間配置器呢?這不是多此一舉嗎?後來在學習之後才明白這樣做是為了進一步提高記憶體的使用率和使用效率。主要是從以下兩方面來考慮的: 1.小
STL空間配置器allocator詳解
stl六大元件簡介 我們知道,stl有容器,空間配置器,介面卡,迭代器,仿函式以及演算法這6個元件,它們六者關係大概如下:容器通過配置器取得資料儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成不同的策略變化,配接器可以修飾或套界仿函式。 侯捷在《STL原始
研究了一下SGI STL的記憶體演算法
原理在STL原始碼剖析中已經有闡述,這裡簡單的說一下,該記憶體池採用HASH-LIST資料結構管理資料,分配一塊記憶體時,如果所要求的記憶體超過了某個數量就直接呼叫malloc分配記憶體, 否則首先進行資料對齊,根據這個對齊的結果得到所在的HASH表,在該HASH-LIST中查詢時候存在可用的節點,如
SGI STL 的記憶體管理
1. 前言 在分析完 nginx 的記憶體池之後,也想了解一下 C++ 的記憶體管理,於是就很自然得想到 STL。STL 是一個重量級的作品,據說當時的出現,完全可以說得上是一個劃時代意義的作品。泛型、資料結構和演算法的分離、底耦合、高複用… 啊,廢話不多說了,再說下去讓人感覺像王婆賣瓜了。 啊,還忘了得加
C++ STL 記憶體配置的設計思想與關鍵原始碼分析
下面會結合關鍵原始碼分析C++STL(SGI版本)的記憶體配置器設計思想。關鍵詞既然是“思想”,所以重點也就呼之欲出了。 1、allocator的簡短介紹 我閱讀的原始碼是SGI公司的版本,也是看起來最清楚的版本,各種命名最容易讓人看懂。allocator有人叫它空間配置器,因為空間不一定是記憶體,也可以是
C++STL記憶體配置的設計思想與關鍵原始碼分析
說明:我認為要讀懂STL中allocator部分的原始碼,並汲取它的思想,至少以下幾點知識你要了解:operator new和operator delete、handler函式以及一點模板知識。否則,下面你很可能看不大明白,補充點知識再學習STL原始碼比較好。 下面會結合關鍵原始碼分析C++STL(SGI版
C++ STL 容器介面卡 棧介面卡
http://blog.sina.com.cn/s/blog_9946f55601016qwk.html C++ STL 容器介面卡 標準庫提供了三種順序容器介面卡:queue、priority_queue、stack.介面卡是標準庫中通用的概念,包括容器介面卡、迭