linux 核心的list和STL的list的區別是什麼?兩個的效率哪個更高?

時間 2021-05-30 16:15:15

1樓:吳詠煒

本質上,std::list 幫你做的事情就是把你的物件加上前後向指標存放到容器裡,幫你做生命週期管理。如果你的結點就只存在於乙個鍊錶之中,兩者的效率沒有任何區別,且 std::

list 使用起來更加方便。std::list 的優點在於,標準庫幫你維護物件的生命週期,而且你自己不需要維護前向和後向指標,標準庫全部幫你搞定。

Linux 核心裡的鍊錶,或者侵入式的鍊錶如 Boost.Intrusive,需要你自己在物件裡放入前向和後向指標,物件的生命週期也需要自己管理——如果物件被釋放,但煉表裡還掛著這個物件,那隨後的崩潰幾乎就不可避免的了。

侵入式鍊錶的主要好處就在於你需要把鍊錶結點掛到多個容器裡的時候。這種情況下,使用 std::list 一般意味著你需要放物件的指標或智慧型指標到煉表裡,這樣,在鍊錶遍歷時就會多一次間接,同時煉表裡的每一項也意味著額外的記憶體分配。

你很可能也做不到徹底的不侵入,而必須在物件裡放上乙個 list::iterator 來允許今後從容器裡釋放自己。

2樓:

linux核心的鍊錶是侵入式(intrusive),就是和一般的資料結構書上教的差不多,每個節點本身包含了next/prev指標,而STL的鍊錶屬於非侵入式(non-intrusive),你可以放裡面放任何型別,不需要含有next/prev指標。

兩種方式各有優點,從效率上來說,侵入式的大部分時候要更高,新增節點的時候不需要額外的記憶體分配。之前見過在標準庫中加入intrusive容器的相關的proposal,但是目前為止沒通過。

boost.intrusive中實現了很多侵入式的容器。他的文件中也非常詳細地列出了侵入式和非侵入式的優缺點。自己看吧,不想翻譯,太長了。

Intrusive and non-intrusive containers

核心頁表和linux的夥伴系統是不是有衝突?

吉公尺 LINUX每個程序的位址空間是虛擬的,也就是說,因此Linux程序記憶體的劃分實際上是基於0 4gb虛擬位址的。如果乙個程式大於128mb而記憶體不夠用時,作業系統會通過缺頁機制將不在記憶體中的頁面通過記憶體管理單元 mmu 將虛擬位址轉換成實體地址並將其從外存載入進來,並且把記憶體中不需要...

Linux 核心和驅動開發工程師的發展前景怎麼樣?職業發展軌道具體應該是怎麼樣的?和其他研發類的職位相比呢?

昆吾 我就是核心轉分布式計算,從事核心開發的經歷對我幫助頗大,最直接的一點就是 再複雜的原始碼都有一看的勇氣,再複雜的原理也都敢試著去理解 最最最愛玩大奶媽 我剛接觸驅動,驅動市場還是挺大的,只要會驅動,去公司做乙個底層開發人員或者去安全公司工作,各種待遇目前還是很OK的,特別是Android的一些...

能用通俗易懂的方法講一下linux中struct inode和struct file的關係嗎?

CobbLiu 每次使用者開啟乙個新檔案,不管是用系統呼叫open 得到乙個int型別的fd,還是用glibc的fopen得到乙個FILE linux核心中就會有乙個struct file與之對應。這是從使用者到系統的視角看到的。反之,從硬碟到作業系統的視角看,以ext4為例,每個檔案系統中的檔案 ...