搜尋

首頁  >  問答  >  主體

c++ 内存池是什么...

今天在知乎上问题问了一个问题, 轮子哥的回答里面提到的内存池的概念, 但是我其实不太清楚内存池到底是什么? 顺便求知乎提问中问题的解答...
链接如下 : 用c++写正则引擎构造nfa的时候到底该用智能指针吗?

天蓬老师天蓬老师2767 天前582

全部回覆(4)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:29:19

    1) 一次向操作系統申請一大堆內存,然後在這之上構建你的對象,最後用完後再還給操作系統,避免頻繁的new delete開銷和產生內存碎片。這些都是當你的程式非常需要效能時考慮的。
    2) shared_ptr 和 unique_ptr 使用時需要明白資源的所有權的是誰的。譬如處於同樣地位兩個Node,它們地位是平等的,此時你無法明確到底該由哪個Node來決定資源該什麼時候釋放,所以shared_ptr 和 unique_ptr 都不貼合應用需求。 從經驗的角度來講,我建議你按照正常指針的方式來實現,最後遍歷整個圖來釋放資源,這樣可以把精力放在實現程序邏輯上。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:29:19

    new和delete記憶體的開銷相對大,直接從已經分配好的記憶體數組找一塊空閒的記憶體塊相對小。所以預先分配一塊大內存,分割為小內存塊,不用時標記空閒,使用時再獲取一下更快速,這就是內存池的雛形。我認為演算法簡單激進的,確實效果好點,但是演算法複雜的池子,不如作業系統自己的new delete,畢竟作業系統也在不斷優化記憶體分配和釋放演算法,只不過是選擇了最保守策略。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 14:29:19

    針對你的第二個問題,最簡單的方法就是使用vector來作為堆疊的主體結構。如果需要更精細的實現,那就需要自己寫一個空間配置器了(可以參考SGI STL中雙層空間配置器的實現)

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:29:19

    帶池字的就是搞一個集合,在這個集合上利用一定算法,優化性能,,內存池,很多內存,自己管理利用。 。線程池,很多線程,管理應用,,用的時候不用在創建浪費時間。及時性比較好

    回覆
    0
  • 取消回覆