本系列是開源書C++ Best Practises[1]的中文版,全書從工具、代碼風格、安全性、可維護性、可移植性、多線程、性能、正確性等角度全面介紹了現代C++項目的最佳實踐。本文是該系列的第五篇。
C++最佳實踐:
1. 工具
2. 代碼風格
3.安全性
4.可維護性
5.可移植性及多線程(本文)
6.性能
7.正確性和腳本
可移植性
明確使用的類型
大多數產生告警的可移植性問題都是因為我們沒有注意類型。標準庫和數組使用size_t作為索引,標準容器的大小使用size_t類型。如果對size_t的處理不正確,可能會潛伏有微妙的64位問題,這種問題只有在開始32位整型索引溢出之后才會出現。另一種類似問題是char類型和unsigned char類型的使用。
使用標準庫
std::filesystem
C++17新增了新的filesystem庫,在所有支持的編譯器上提供了可移植的文件系統訪問能力。
std::thread
C++11的線程功能能夠基于pthread或WinThreads使用。
其他
本系列中的其他大多數問題最終都可以歸結到可移植性上,尤其要注意避免靜態(static)類型(參考下文多線程部分)。
多線程
避免全局數據
全局數據會導致函數之間意想不到的副作用,并可能使代碼難以甚至無法并行化。即使現在的代碼不是為了并行化而寫,也沒有理由在將來永遠不做并行化。
靜態(static)數據
除了作為全局數據之外,靜態數據并不總是像期望的那樣被構造和析構,在跨平臺環境中尤其如此。例如,有個g++的bug[2]就是關于從動態模塊加載的共享靜態數據的銷毀順序的。
共享指針
std::shared_ptr和全局變量一樣(http://stackoverflow.com/a/18803611/29975),允許多段代碼與相同的數據交互。
單例(Singleton)
單例通常使用靜態和/或shared_ptr實現。
避免堆操作
堆操作在多線程環境中要慢得多,在許多甚至大多數情況下,復制數據會更快,更別提還有move操作這之類的東西。
互斥對象(mutex)和可變對象(mutable)一起使用(M&M規則,C++11)
對于成員變量,最好同時使用互斥鎖和可變變量,這在兩方面都適用:
可變成員變量被假定為共享變量,因此應該與互斥鎖同步(或原子化)。
如果一個成員變量本身是互斥的,那么應該是可變的,這是在const成員函數中使用它所必需的。
-
C++
+關注
關注
22文章
2104瀏覽量
73503 -
代碼
+關注
關注
30文章
4753瀏覽量
68368 -
可移植性
+關注
關注
0文章
5瀏覽量
7600
原文標題:C++最佳實踐 | 5. 可移植性及多線程
文章出處:【微信號:C語言與CPP編程,微信公眾號:C語言與CPP編程】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論