<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C++基礎-內存管理

    • 發布:C++培訓
    • 來源:代碼備忘錄
    • 時間:2019-11-29 14:06

    本文主要是堆、棧和RAII,屬于內存管理的范疇吧。說一下自己的心得體會。

    堆和棧的概念

    在早期學生時期寫代碼幾乎是沒有內存管理的概念的,什么時候該用new/malloc(堆),什么時候用局部變量(棧),完全是看心情的。后來工作中開始對大對象使用new/malloc,小對象使用局部變量,多少算大?多少算小?差不多十年前有個商業軟件叫PCLINT,可以統計單個函數棧的內存使用(統計局部變量),那時我所在部門,沒記錯的話超過2K會告警。到了Modern C++,我所得到的大部分規則是:盡量避免動態內存分配。當然我覺得這大部分基于一點:就是現代的軟硬件系統,內存大小越來越不是約束條件了。只要不是超級大對象,在棧上分配往往意味著更好的性能。舉個列子:

    void func() { // 這是一個不好的例子 // 當然還能有更糟糕的寫法, 比如直接new auto foo = std::make_unique<Object>(); foo->balabala(); // 好的實踐 Object bar; bar.balabala();}

    首先,在Modern C++里面我們已經不提倡直接使用new/delete了,我覺得除非是在編寫一些內存管理相關的公共庫或模板類,否則都應該遵循這一準則。取而代之的是使用智能指針,比如 unique_ptr。

    然后針對上面這段代碼,如Object不是一個大對象,那么就沒有必要去堆上申請空間來維護他,因為使用棧上的局部變量更加高效(在我看來C++的很多設計始終維持不變的原則就是保持高效)。

    RAII

    RAII (Resource Acquisition Is Initialization) 可以參考C++ Core Guidelines 里面的介紹:R.1: Manage resources automatically using resource handles and RAII (Resource Acquisition Is Initialization): isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines.html#Rr-raii 作為 Core Guidelines資源管理的第一條規則,自然是有道理的。

    RAII 的主要目的是為了避免或者減少手動地管理資源,從而避免各種資源泄漏。

    對于RAII其實之前我一直是有顧慮的,原因主要是考慮當處理一些Legacy的C接口的時候,如果把一些資源初始化的接口構造函數里面調用,那么返回失敗了應該在構造函數里面拋異常么?如果拋了異常,那么析構函數是不會被調用的。基于以上原因在編寫Legacy資源的Wrapper類的時候是需要小心處理的,不然反倒容易被自己迷惑。

    關于內存管理的一些補充

    在Modern C++的內存使用中,還有一些之前的心得,列出來供參考。

    如何避免使用裸指

    當然是盡量使用引用,或者使用智能指針了。當然有時候你需要代碼足夠地高效從而使用引用,但是這個引用又可能為空,那么問題就來了,因為C++目前沒有NullReference這個東西,那么只好考慮一下裸指針了。

    關于智能指針的使用

        盡量使用make_unique, make_shared 來初始化智能指針,因為相對來說他們是Exception Safe的,并且有著更好的效率。

        不要再使用auto_ptr了,已經過時了,更加不要再實際項目中自己編寫Memory Guard了,當然作為理解概念練手還是有必要的。

        shared_ptr的使用要謹慎,考慮一下真的需要share么?是不是引用就可以了?循環引用則需要引入weak_ptr。

    本文內容轉載自網絡,本著分享與傳播的原則,版權歸原作者所有,如有侵權請聯系我們進行刪除。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:C++數組相關
    下一篇:C++ Swap函數有幾種寫法?

    C語言創建windows窗口實例

    C++回調函數是什么?

    C++ shared_ptr和動態數組

    C語言有哪些關鍵詞,C語言44個關鍵詞大全

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>