空間配置器:
為什麼不說allocator是記憶體配置器:空間不一定是記憶體,空間也可以是磁碟或其他儲存介質,你可以寫乙個allocator直接向硬碟取空間。
sgi stl的配置器名為alloc,是預設的空間配置器。
雖然也定義了乙個符合部分標準的allocator配置器,但只是把c++中new和delete簡單包裝而已,效能不佳。
sgi std::alloc:new包含了:operator new記憶體配置 和 物件構造 兩個過程。
delete包含了: 物件析構 和 operator delete記憶體釋放
stl 將兩個階段操作區分開來:
考慮小型區塊造成的記憶體破碎問題,sgi設計了雙層級配置器
記憶體池
記憶體池管理:每次配置一大塊記憶體,並維護對應之自由鍊錶:free_list,下次若還有相同大小的記憶體需求,直接從鍊錶中拔出,如果客戶端釋還小額區塊,就由配置器**到free_list中。為了方便管理,任何小額記憶體需求均上調至8的倍數。
allocator需要維護乙個儲存16個空閒塊列表表頭的陣列free_list,陣列元素i是乙個指向塊大小為8*(i+1)位元組的空閒塊列表的表頭,乙個指向記憶體池起始位址的指標start_free和乙個指向結束位址的指標end_free。空閒塊列表節點的結構如下:
union obj
;
這個結構可以看做是從乙個記憶體塊中摳出4個位元組大小來,當這個記憶體塊空閒時,它儲存了下個空閒塊,當這個記憶體塊交付給使用者時,它儲存的時使用者的資料
當free_list不夠時,從記憶體池中取新空間為free_list填充新空間。
當記憶體池不夠時,從堆申請新空間。
當堆不夠時,交由第一級配置器使用類似new_handler機制處理。
iterator
traits(萃取)技術:利用模板的引數推導機制,獲取任意迭代器的特徵資訊:
templatestruct iterator_traits
如果t定義有自己的value_type,通過traits的作用,萃取出來的就是t::value_type。
這種多了一層間接性的好處是可以擁有原生指標的偏特例化版本:如偏特例化原始指標版本iterator_traits和iterator_traits
。
原生指標int*雖不是一種類型別,亦可通過iterator_traits取其value_type。
序列容器:vector
頻繁對vector呼叫push_back()對效能的影響和原因:當push_back()將新元素插入vector尾端時,首先檢查是否還有備用空間,如果容量被用完,並不是在原空間後接續新空間,而是以原大小的兩倍重新分配一塊空間,將原內容拷貝過來,並新增上新元素,釋放原空間。
一旦push_back()引起空間重新配置,指向原vector的所有迭代器失效。
序列容器:list
雙向鍊錶stl list是乙個環狀雙向鍊錶
序列容器:deque 雙向佇列
deque沒有容量(capacity)的概念,動態的以分斷連續空間組合而成,可以隨時增加一段新的空間並鏈結起來。
deque是由一段一段的連續空間構成,由迭代器維護整體連續的假象
中控器為乙個連續陣列空間(對映/map),每個元素都是指標,指向一段連續線性空間(緩衝區),緩衝區大小一致
在deque上排序很慢,可將資料拷貝至vector ,排序後拷貝回deque
容器介面卡:stack 棧
stack底層預設以deque實現,不提供迭代器
stack
>
stack
>
容器介面卡:queue 佇列
queue底層預設是deque實現,不提供迭代器
queue
>
queue
>
heap只有演算法,屬於幕後工作者,是優先佇列的助手
容器介面卡:priority queue 優先佇列
優先佇列預設是最大堆實現
最大堆預設是vector實現的完全二叉樹:
priority_queue,less>
priority_queue,greater>
面經筆記 管道
匿名管道只能實現本機機器上兩個程序的通訊,通常用來在父子程序間通訊,不能實現跨網路的通訊。下面只貼出核心 父程序 void cparentview onpipecreate startupinfo sui 建立新程序所需資訊結構體 process information pi 程序資訊結構體 zer...
面經 葫蘆面經
1 給定乙個n位數,例如12345,從裡面去掉k個數字,得到乙個n k位的數,例如去掉2,4,得到135,去掉1,5,得到234。設計演算法,求出所有得到的 n k位數裡面最小的那乙個 2 找明星 n個人中,只有乙個明星 明星不認識其他所有的人,而其他人 都認識明星,這些人中也可能相互認識。你每次只...
面經筆記 cuda gpu概念
與cuda相關的幾個概念 thread,block,grid,warp,sp,sm。sp 小核 流處理器 最基本的處理單元,streaming processor 最後具體的指令和任務都是在sp上處理的。gpu進行平行計算,也就是很多個sp同時做處理 sm 大核 流多處理器 多個sp加上其他的一些資...