有關於提升C/C++運行效率以及避免出現Bug的幾種常見的實用方法

提升C/C++效率

  1. 若能夠替代的話,儘量使用前綴操做符代替後綴操做符,如利用++i來代替i++,由於後綴操做符會產生一個臨時變量,而且涉及到複雜的拷貝複製等。數組

  2. 對於乘法操做盡量的利用位運算,如b= a * 16能夠改寫爲b = a << 4,由於位操做的效率要比乘法以及除法的效率高。多線程

  3. 一個很好的交換兩個數的方法:a = a^b; b = a^b; a = a^b;既能夠將變量a與變量b進行交換,即消除了交換變量值時所用的臨時變量,同時提升了效率。函數

  4. for循環中for(int i = 0; i != 100; ++i) 儘量的使用 != 號而不是 < 號,除非必須使用 < 纔不用 != 優化

  5. C++中變量初始化的時候儘可能使用int i(0);而不是int i = 0;的方式來給變量初始化。spa

  6. 使用memset()memcpy()memcmp()來代替strcpy()strcmp()等函數。線程

  7. 使用snprintf()來代替sprintf()函數,永遠也不要用sprintf()函數。指針

  8. 使用fgets()函數來代替gets()函數,放置輸入的字符串太長而引發內存泄露。code

  9. 全部定義的*.h的頭文件都必要加上#ifndef  #define …. #endif這樣的結構,從而避免頭文件被重複引用,而形成程序出錯。orm

  10. 定義結構體時,一般在前面加上typedef造成typedef struct{ } std;這樣的結構。這樣給結構體起個別名,使結構體更加清晰。內存

  11. 全部的常數都應該用宏定義,如 #define OK 1 這樣的方式,而不是直接使用1,從而防止「魔數」的發生,而switch…case語句則採用enum{ }; 來避免「魔數」。

  12. 合理的使用register以及 inline函數對程序進行優化,對於不發生變化的常量必定要加const關鍵字,從而避免常量被修改。

  13. 對於那些只須要作一次計算的操做,要提到循環的外面進行操做,從而避免每次循環都進行一次沒必要要的計算。如for(int i = 0; i != strlen(a); ++i);中的strlen(a)要提到for循環的外面。即int Len = strlen(a); for(int i = 0; i != Len; ++i);這樣stelen(a)僅運行了一次。

  14. 對於變量定義的位置問題,儘可能要作到「直到非定義不可的時候才定義」這樣能夠有效的減少該變量佔用內存的時間,同時也能夠避免定義的變量最後沒有用到的現象。

  15. for循環嵌套循環等,要儘量的將次數多的循環放置最內層,次數少的循環放在最外層,這樣能夠減小計算機進行「切換」,從而提升運行的效率。

  16. 對於條件判斷如if…else語句以及switch…case語句等要將可能性大的操做放在前面,這樣能夠減少計算機對程序進行逐次判斷的機率,能夠及時的命中操做,從而能夠提升效率。

  17. 對於矩陣相乘運算,儘量的不要使用咱們一般採用的方式,即 *列,而是採用依次相乘而後累加的策略,從而避免內存的未命中的狀況。

  18. 在調用free()函數釋放指針的時候要將指針變量指爲空,即free(p); p = NULL;從而防止指針成爲野指針。

  19. 對於sizeof()操做符,對操做變量並無改變,即int i = 10sizeof(++i); 運行完畢後i的值仍然爲10而不是11

  20. 對於&&以及||表達式來講,其知足最優原則,即如( f1() == f2() ) && ( f3() == f4() )若第一個表達式爲假的話就不會運行第二個表達式,同理對於||操做符來講,若第一個表達式爲真,則不會運行第二個表達式。

  21. 對於簡單的if…else…操做,儘可能使用三目運算符A>B?A:B來替換能夠提升程序的運行效率。

  22. C++中使用運算符時儘可能只用一種運算符,這樣當進行運算符重載時,能夠減小重載函數的數目,簡化代碼。

  23. Static關鍵字修飾局部變量的時候,表徵此變量保持不變;在修飾全局變量的時候,表徵此全局變量只能在本模塊中反問,對其餘模塊是不可見的;當修飾一個函數時,也表徵着此函數僅在當前模塊中有效。

  24. Volatile關鍵字修飾變量表徵着此變量將被存於內存中,每次程序訪問時都將重新從內存中提取,而不會被優化。一般用於(1)硬件設備的某些寄存器(如:狀態寄存器);(2)某些ISR會訪問到的非自動變量(Non-automatic variables);(3)多線程應用中被幾個任務共享的變量。

  25. 切記extern  char *hello;entern char hello[ ]是兩個概念,不要覺得數組名是指針就能夠亂用。

相關文章
相關標籤/搜索