STL源碼分析1-空間適配器

喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,

圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。


title: STL源碼分析1 - 空間適配器
mathjax: true
date: 2020-03-24 19:36:05
categories: [c++筆記,STL源碼分析]
tags: [c++筆記,STL源碼分析]
keywords: [c++筆記,STL源碼分析]


空間配置器

   STL的空間適配器事STL的基礎,我們不能靠操作系統來爲我們管理內存,那樣的代價太大了,這不划算,作爲一個c/c++開發人員,我們要完全控制我們程序的一切。

allocator

   這是他的英文名字,我們的allocator定義了四個操作

  • alloc::allocate() 內存配置
  • alloc::dellocate() 內存釋放
  • alloc::construct() 構造對象
  • alloc::destroy() 析構對象

type_traits

   一個模版元技術,他是一個類,能夠萃取類型的相關信息,模版元詳見C++筆記中的Boost源碼分析

destroy

   對於基本數據類型,我們啥都不用幹,對於用戶定義的數據類型,我們顯示調用析構函數即可,這個使用模版特化即可。

construct

   就是new,但是不用申請空間了,因爲allocate已經幹了

一級配置器、二級配置器

   一級配置大空間(>128bytes)就是malloc和free,二級配置小空間,利用內存池。

一級配置器

   直接new的,new失敗以後調用out of memery的處理方式調用處理例程,讓其釋放內存,不斷嘗試,釋放的時候直接free

二級配置器

  維護16個鏈表,每個鏈表維護一種類型的內存,分別爲8bytes、16bytes、24bytes、一直到128bytes。更加巧妙的地方是將維護的內存和鏈表的指針使用聯合體組裝。這就不浪費空間了。當需要配置內存的時候,向8字節對齊,然後再分配,當釋放內存的時候,丟到鏈表裏面就行了
   當鏈表空了的時候,從內存池中取出20個新的內存塊填充鏈表。
   內存池是一個大塊大內存,當內存池空了以後,申請更多的內存,保證每次都比上一次申請的多就行了,要是讓我實現,我纔不這樣做,我要用計算機網絡中的自適應rtt原理來做。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章