《STL原始碼剖析》筆記 1

2021-07-16 16:32:52 字數 1715 閱讀 8231

第一章、stl概論與版本簡介

一、臨時物件的產生與運用。p36

這裡的臨時物件,指的是一種無名物件(unnamed subjects),如果它們的產生不在程式設計師的預料之下,往往造成效率的負擔,但有時刻意製造臨時物件會讓程式乾淨清爽。刻意製造臨時物件的方法是,在型別名稱後直接加一對小括號,並可指定初值。例如shape(3,5)或者int(8),其意義相當於呼叫相應的建構函式且不指定物件名稱。stl常將此技巧應用在仿函式(functor)與演算法的搭配上。

例如:

#include#include#includeusing namespace std;

templateclass print

};int main()

; vectoriv(ia, ia+6);

//print()是乙個臨時物件,不是函式呼叫操作

for_each(iv.begin(), iv.end(), print());

return 0;

}

最後一行產生的便是"class template"的具現體print的乙個臨時物件。

ps:賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。過載賦值運算子函式必須是public的,否則會編譯錯誤,因為使用者定義了過載賦值運算子函式,編譯器就不會提供預設的。在類中過載的賦值運算子函式不能被繼承。

通常情況下編譯器提供的預設過載賦值運算子函式能夠解決物件間賦值的問題,但是當類中含有指標資料成員時,容易引起指標懸掛的問題,

所以這種情況下有必要進行賦值運算子過載。

如果針對某個class進行operator()過載,它就成了乙個仿函式。

第二章、空間介面卡

一、stl記憶體管理中的free_lists:

次層配置(sub-allocation):每次配置一塊大記憶體,並維護對應的自由鍊錶(free_list)。下次若再有相同大小的記憶體需求,就直接從free_lists中拔出。如果客端釋還小額區塊,就由配置其**到free_list中。為方便管理,sgi第二級介面卡會主動將任何小額區塊的記憶體需求量上調至8的倍數(例如客端要求30bytes,就自動調整為32bytes)。並維護16個free_lists。

ps:stl中利用位運算上調為8的倍數:

union obj

;enum ; //小型區塊的上調邊界

size_t round_up(size_t bytes)

free_list節點結構如下:

union obj

;

乙個自由鍊錶(free_list)在同一時刻,具備且僅具備如下功能之一:

1、作為乙個自由鍊錶指標,指向下乙個自由鍊錶

2、自身作為一塊可用記憶體,供使用者使用

由於如上用途不可能同時出現,故將obj定義為union,將free_list_link和client_data共享同一塊記憶體來節省記憶體。

一旦這個自由鍊錶塊被分配給使用者了,那麼它就從自由鍊錶中被移除了,不再被認為是乙個自由鍊錶塊(由union的語義,從此它就是一塊普通的,分配給使用者的記憶體,直到被使用者釋放,它才會被再次加入自由鍊錶中)。

free_list從0開始算起,只需要做一次位運算來決定使用第n號free_list:

size_t freelist_index(size_t bytes)

STL原始碼剖析筆記

在stl中,迭代器使得容器與演算法分離開來,迭代器會定義五種型別。hash table是一種資料結構,和rb tree類似。其中set map multi set multi map都是基於rb tree。在stl中,patial sort 和nth element 不一樣。patial sort是...

STL原始碼剖析 讀書筆記(1)

stl即c 標準模板庫,主要由六大部件組成,分別是 分配器 容器 迭代器 演算法 仿函式 介面卡。在講述這些主要部件之前,先來了解一下物件導向程式設計和泛型程式設計,物件導向程式設計 object oriented programming,簡稱oop 企圖將資料和處理資料的方法放到一起,例如,在c ...

《STL原始碼剖析學習筆記》

1 演算法泛化過程 首先是模板 適應不同型別 其次是迭代器 具有原生指標行為的類 最後是仿函式 行為類似函式指標,但更適合泛化 泛化的優點 個人總結 1 簡化程式,提高 的可重用性 2 提高了程式的通用性 3 提高了程式的可讀性 4 提高了安全性 函式指標及仿函式 首先說說函式指標,乙個程式可能需要...