c語言裡malloc的最優實現方式是什麼?

時間 2021-05-30 11:26:45

1樓:

壓根不關心malloc ,critical path malloc-free, 非critical的你加鎖我都無所謂。 其他情況我用go, python, nodejs.

2樓:vibiu

讀過redis的原始碼會發現它自己實現了乙個zmalloc,允許使用google的tcmalloc和facebook的jemalloc,這兩種實現應該算比較優秀的。

3樓:

曾經做過乙個。

首先的問題是從系統中分配虛擬,無論是sbrk還是mmap,或者virttualAlloc,並沒有什麼太大區別,之後的問題是每次malloc時,把系統記憶體切割出來小塊返回。

如果malloc足夠大,那麼直接分配系統記憶體,比如glibc在大於128kb的時候呼叫mmap。

否則,從乙個大塊中切割。

如果沒有free,那麼是很簡單的。。

問題在於free之後的記憶體如何被重複利用。

重複利用可以考慮用分組的方式,

比8,16,24,32 byte這樣的組,這樣就能解決free的記憶體碎片了。。

4樓:Xinyu Tan

我自己的嵌入式系統核心專案上的動態記憶體管理有兩個模組乙個是二叉樹管理的buddy 演算法記憶體分配用來給短時間高頻申請表和釋放記憶體的請求用的。好處是沒有外部碎片而且因為記憶體會在短時間內釋放出內部碎片化也不會太嚴重。 另乙個是普通的malloc 實現無所謂,用來分配給那些短期內不會釋放的記憶體請求。

沒有內部碎片化,因為請求和釋放不頻繁地外部碎片不嚴重。

5樓:zr scat

記憶體分配有演算法研究,設計不好的話會造成記憶體空洞,導致無法分出大塊連續的記憶體。

普通malloc是比較複雜的,不僅僅是分配記憶體的問題,還涉及作業系統相關的異常處理,清理快取,虛擬記憶體管理等。

linux核心裡有一種方法簡單易於實現,就是預先分配好64位元組,節,節,節,1k位元組若干,再大就分page,分配記憶體時,找最小匹配。這樣的做法是分配效率非常高,釋放的時候不會導致碎片。

關於c語言的malloc 0xffffffff 的乙個問題???

千年放浪 如 李洋 所說,我在64位機上看到的語法樹解析完的結果如下 sizeof size t 是8。1其實轉換成了 1ull。 malloc的引數是無符號整數size t型別,所以你用0xffffffff做引數,就會預設是正整數,而 1做引數,就會導致錯誤。還有,malloc返回值要顯式轉化,不...

能用c語言演算法實現嗎?

uciicu include int main int A,B,C,D,n 分為ABCD四個數,n僅為計算該程式最終迴圈次數,非必要 int a,b,c,d for A 1 A 7 A 按照題設,每個數最小為1最大為7 for B A B 7 B for C B C 7 C for D D D 7 ...

c 裡如何實現static warning?

原子筆 template X struct example It just declares a function but does not define a variable define static warning x,str example x 0 1 30 str example 0 in...