標籤:資料 bug 注釋 對象 拷貝 依賴 絕對路徑 中文編碼 純虛函數
1. 對齊原則。比如64位匯流排,每次定址讀取8B。編程時注意變數地址,盡量消耗匯流排最少的定址次數。堆記憶體申請時,系統嚴格按照對齊原則分配,故而使用時候也盡量不要跨定址邊界。
2. 需要的時候,可為了效率拷貝代碼,雖然增加了代碼體積,但這是值得的。尤其是for迴圈,若次數比較少,拆開亦無妨。
3. 位元運算中,-1右移,左邊補1,故仍為-1;-1左移,右邊補0,故不再為-1。
4. 每次申請的堆記憶體,最好初始化,裡面是垃圾資料,而並非為空白。
5. 項目開發中,往往一個引擎對外暴露的是一個純虛類,而其介面就是這個類的**指標變數。
6. 程式邏輯,重在語義。不能為代碼的過分簡單而減少函數的設計。
7. *&表示對指標的引用。
8. 類的靜態方法不可調用其非靜態方法,亦不可調用非靜態成員變數。
9. 多檔案編程時,標頭檔不可相互包含。
10. 標頭檔裡盡量不要使用using namespace std;
11. static成員定義要放在cpp檔案裡面,而不是標頭檔裡。
12. 純虛類盡量不要延續兩層以上。
13. include引用盡量都放在cpp檔案裡。
14. 子類繼承父類,不可在建構函式裡初始化父類並未在建構函式裡初始化的成員,也就是說,子類建構函式裡能初始化的成員,只有自己本身的和父類建構函式裡的。
15. 項目開發中,對於一些依賴本地環境的參數,要寫專門的設定檔,比如伺服器位址。
16. 標頭檔裡只聲明,不定義。在標頭檔中,全域變數聲明,必須加extern修飾;靜態成員變數聲明放在標頭檔,定義放在cpp檔案,若是普通靜態變數,最好聲明和定義放在cpp,因為static範圍限於單檔案,放在cpp裡只對本檔案可見,放在標頭檔會被所有引用該標頭檔的cpp拷貝一份完全相同的變數。
17. linux下,進行檔案操作時,檔案路徑要採用絕對路徑(相對路徑很多時候會出bug),檔案指標要對其傳回值作判斷,防止null 指標。
18. debug狀態下使用assert是極好的,不過記得發布版本前在#include <cassert>前加上#define NDEBUG,assert語句會被NDEBUG所影響。這裡多嘴一句,錯誤與異常是不同的,異常是不可避免,在發布版本裡不可或缺的,故而assert不能用於處理異常。註:在加上#define NDEBUG後,不論是調試還是運行,assert語句都會被直接忽略,故而平時開發時把#define NDEBUG注釋掉,發布時再啟用它。
19. 物件導向編程:可維護,可複用,可擴充,靈活性好。
20. 頻繁使用的代碼裡,盡量少使用容器,因為其建立和回收的開銷很大。
21. 字串拼接效率:經過測試(http://bbs.csdn.net/topics/360000434和我自己項目中的實驗),memcpy效率最高,string類的+=效率特別高,足以滿足日常所需,而strcat效率很差,append也不快。
22. 基類中的虛函數要麼實現,要麼是純虛函數(絕對不允許聲明不實現,也不純虛)。
23. 在C++的類中,普通成員函數不能作為pthread_create的線程函數,如果要作為pthread_create中的線程函數,必須是static。
24. 當多個線程訪問同一個類靜態方法時,若該方法裡只操作棧上資料,則無妨,因為線程的棧是獨立的;若該方法操作了非棧上的資料(比如堆、全域變數等),則需要互斥鎖。
25. 內嵌函式,定義體要放在標頭檔,以保證每一個引用該標頭檔的cpp裡都是完全相同的拷貝;inline關鍵字置於定義前,不必放在聲明前;若定義在類內部,可不需要inline關鍵字。
26. vector執行clear時,會自動調用元素(如果是類的話)的解構函式。
27. 編程時,對變數(尤其是全域性質的變數或類)命名,要用解釋性的,而不能用隨意的j1,i1,n,m等名稱,容易與庫裡的變數衝突。
28. 定義宏時,盡量多用整數,少用-1,-2之類,容易受uint和int不統一帶來的困擾。
29. 函數形參採用預設值時,要寫在聲明裡,而不寫定義裡,這樣方便調用其標頭檔的cpp看得到預設值。
31. utf-8 中文編碼 三個位元組表示一個漢字
32. 項目開發時,使用條件編譯:
#define DEBUGmain(){#ifdef DEBUG printf("Debugging\n");#else printf("Not debugging\n");#endif printf("Running\n");}
發布版本時,注釋掉第一行。這種方式要比開大量注釋來得方便。
C++編程最佳化心得(持續更新)