<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C++最佳實踐 | 5. 可移植性及多線程

          共 1583字,需瀏覽 4分鐘

           ·

          2022-10-15 09:04

          本系列是開源書C++ Best Practises[1]的中文版,全書從工具、代碼風格、安全性、可維護性、可移植性、多線程、性能、正確性等角度全面介紹了現(xiàn)代C++項目的最佳實踐。本文是該系列的第五篇。

          C++最佳實踐:

          1. 工具

          2. 代碼風格

          3. 安全性

          4. 可維護性

          5. 可移植性及多線程(本文)

          6. 性能

          7. 正確性和腳本

          可移植性

          明確使用的類型

          大多數(shù)產生告警的可移植性問題都是因為我們沒有注意類型。標準庫和數(shù)組使用size_t作為索引,標準容器的大小使用size_t類型。如果對size_t的處理不正確,可能會潛伏有微妙的64位問題,這種問題只有在開始32位整型索引溢出之后才會出現(xiàn)。另一種類似問題是char類型和unsigned char類型的使用。

          參考: http://www.viva64.com/en/a/0010/

          使用標準庫

          std::filesystem

          C++17新增了新的filesystem庫,在所有支持的編譯器上提供了可移植的文件系統(tǒng)訪問能力。

          std::thread

          C++11的線程功能能夠基于pthreadWinThreads使用。

          其他

          本系列中的其他大多數(shù)問題最終都可以歸結到可移植性上,尤其要注意避免靜態(tài)(static)類型(參考下文多線程部分)。

          多線程

          避免全局數(shù)據(jù)

          全局數(shù)據(jù)會導致函數(shù)之間意想不到的副作用,并可能使代碼難以甚至無法并行化。即使現(xiàn)在的代碼不是為了并行化而寫,也沒有理由在將來永遠不做并行化。

          靜態(tài)(static)數(shù)據(jù)

          除了作為全局數(shù)據(jù)之外,靜態(tài)數(shù)據(jù)并不總是像期望的那樣被構造和析構,在跨平臺環(huán)境中尤其如此。例如,有個g++的bug[2]就是關于從動態(tài)模塊加載的共享靜態(tài)數(shù)據(jù)的銷毀順序的。

          共享指針

          std::shared_ptr和全局變量一樣(http://stackoverflow.com/a/18803611/29975),允許多段代碼與相同的數(shù)據(jù)交互。

          單例(Singleton)

          單例通常使用靜態(tài)和/或shared_ptr實現(xiàn)。

          避免堆操作

          堆操作在多線程環(huán)境中要慢得多,在許多甚至大多數(shù)情況下,復制數(shù)據(jù)會更快,更別提還有move操作這之類的東西。

          互斥對象(mutex)和可變對象(mutable)一起使用(M&M規(guī)則,C++11)

          對于成員變量,最好同時使用互斥鎖和可變變量,這在兩方面都適用:

          • 可變成員變量被假定為共享變量,因此應該與互斥鎖同步(或原子化)。
          • 如果一個成員變量本身是互斥的,那么應該是可變的,這是在const成員函數(shù)中使用它所必需的。

          更多信息請參閱Herb Sutter的文章: GotW #6a Solution: Const-Correctness, Part 1[3]

          也可以參考前面關于const &返回值安全性[4]的討論。

          微信公眾號:DeepNoMind

          參考資料

          [1]

          C++ Best Practises: https://lefticus.gitbooks.io/cpp-best-practices/content/

          [2]

          Problem with C++ unique symbols in plugins: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66830

          [3]

          GotW #6a Solution: Const-Correctness, Part 1: http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/

          [4]

          C++最佳實踐之安全性: https://www.mdnice.com/writing/210940dd994a4b76930359652864bca3

          - END -

          點擊閱讀原文加入知識星球

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  乱伦AV网 | 亚洲熟妇一区二区三区 | 中文色网| 国产一卡二卡三卡 | 日韩黄色影视 |