STL 記憶體池原始碼學習與思考

2021-07-24 13:00:24 字數 1420 閱讀 1399

首先說明一下,這次學習的是stl空間配置器的原始碼中記憶體池部分的函式,下面是原始碼:
template char*

__default_alloc_template<__threads, __inst>::_s_chunk_alloc(size_t __size,

int& __nobjs)

else if (__bytes_left >= __size) else _s_start_free = (char*)malloc(__bytes_to_get); if (0 == _s_start_free) } _s_end_free = 0; // in case of exception. _s_start_free = (char*)malloc_alloc::allocate(__bytes_to_get); // this should either throw an // exception or remedy the situation. thus we assume it // succeeded. } _s_heap_size

+= __bytes_to_get; _s_end_free = _s_start_free + __bytes_to_get; return(_s_chunk_alloc(__size, __nobjs)); }}

這個函式的功能網上很多人都已經有介紹,這裡就不重複了,在這只提出我對這段**一些疑問和思考,如果想錯了希望大家能夠幫忙指導,這裡先謝過了!!

**的中的乙個處理邏輯是:

如果當前記憶體池中的剩餘空間不足乙個__size的但是剩餘空間大於0時做如下處理(**中標紅的部分):

根據剩餘空間的大小將這部分空間編入free_list中。

因為free_list分為塊大小為8,16,24,32,...,128,   16個區塊,所以要將剩餘記憶體編入,首先需要根據剩餘空間大小定位應該放在哪個區塊鍊錶上。

**如下:

_obj* __stl_volatile* __my_free_list = _s_free_list + _s_freelist_index(__bytes_left);

_s_freelist_index函式原始碼:

static  size_t _s_freelist_index(size_t __bytes)
其中_align是8;這個函式在從free_list中取資料是容易理解的,比如小於8返回的大小為8對應的鍊錶,大於8小於17返回的是大小為16對應的鏈,以此類推

但是個人認為將剩餘空間的資料編入free_list時這個函式定位就有問題了:

比如:剩餘空間大小為9,該函式返回的索引的1,對應的是大小為16的區塊鍊錶,不是應該放在大小為8的區塊鍊錶中更合理嗎?

希望大家多多指教

STL原始碼分析之記憶體池

前言上一節只分析了第二級配置器是由多個鍊錶來存放相同記憶體大小,當沒有空間的時候就向記憶體池索取就行了,卻沒有具體分析記憶體池是怎麼儲存空間的,是不是記憶體池真的有用不完的記憶體,本節我們就具體來分析一下 記憶體池static data template的初始化 template char defa...

STL原始碼剖析 記憶體池的實現

2019年3月15日 3月23日,大概花了8天的時間,終於將sgi stl版本實現的記憶體池看懂了。不過記憶體池這個知識點大概在2018年8月份的時候就已經接觸了,今天終於弄懂了,如卸心中之塊壘!在此 的一些點,可能非常表面,如果需要深入了解,建議直接閱讀 stl原始碼剖析 侯捷 相應章節。記憶體池...

stl記憶體池學習(二) 走近記憶體池

這一節學習基礎知識 所用到的資料結構。首先看記憶體池的介面 code ifndef mem pool h define mem pool h static size t freelist index size t bytes static size t round up size t bytes s...