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