1. 程式人生 > >提高C/C++執行效率以及避免出現Bug的20種方法

提高C/C++執行效率以及避免出現Bug的20種方法

這是在工作和學習中總結的有關於提高C/C++執行效率以及避免出現Bug的幾種常見的實用方法,當然還有許多更有效的方式有待進一步的探索。

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;的方式來給變數初始化。
6、使用memset(),memcpy(),memcmp()來代替strcpy(),strcmp()等函式。
7、使用snprintf()來代替sprintf()函式,永遠也不要用sprintf()函式。
8、使用fgets()函式來代替gets()函式,放置輸入的字串太長而引起記憶體洩露。
9、所有定義的*.h的標頭檔案都必要加上#ifndef #define …. #endif這樣的結構,從而避免標頭檔案被重複引用,而造成程式出錯。
10、定義結構體時,通常在前面加上typedef形成typedef struct{ } std;這樣的結構。這樣給結構體起個別名,使結構體更加清晰。
11、所有的常數都應該用巨集定義,如 #define OK 1這樣的方式,而不是直接使用1,從而防止“魔數”的發生,而switch…case語句則採用enum{ }; 來避免“魔數”。
12、合理的使用register以及 inline函式對程式進行優化,對於不發生變化的常量一定要加const關鍵字,從而避免常量被修改。
13、對於那些只需要做一次計算的操作,要提到迴圈的外面進行操作,從而避免每次迴圈都進行一次不必要的計算。如for(inti = 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 = 10;sizeof(++i);執行完畢後i的值仍然為10而不是11。
20、對於&&以及||表示式來說,其滿足最優原則,即如( f1() == f2() ) && ( f3() == f4() )若第一個表示式為假的話就不會執行第二個表示式,同理對於||操作符來說,若第一個表示式為真,則不會執行第二個表示式。

相關推薦

提高C/C++執行效率以及避免出現Bug的20方法

這是在工作和學習中總結的有關於提高C/C++執行效率以及避免出現Bug的幾種常見的實用方法,當然還有許多更有效的方式有待進一步的探索。 1、若可以替代的話,儘可能使用字首操作符代替字尾操作符,如利用++i來代替i++,因為字尾操作符會產生一個臨時變數,並且涉及

vs C++ 靜態庫 生成以及使用的兩方法

C++靜態庫的生成 1、 vs專案配置:選擇 靜態庫 2、 新建標頭檔案 add.h 3、 新建標頭檔案 add.cpp 4、 執行“生成解決方案”,工程DEBUG目錄如下: C++靜態庫的使用 方法一 1、 新建 win32控制檯應用程式 2、 專案屬性-->c/c

c++ 運算執行效率提高技巧

儘量避免使用值傳遞,推薦使用const 引用來傳遞引數 臨時變數的代價。 迴圈體中的區域性變數,儘量在迴圈體內定義  複製操作與構造解構函式的代價差異。  避免過大的迴圈 cache的時間侷限性和空間侷限性 時間侷限性:如果一個儲存單元被訪問,則可能該單元會很快再次被訪問,因

提高C++程式執行效率的10個簡單方法

本文以C/C++程式為例講述了程式執行效率的10個簡單方法,分享給大家供大家參考之用。具體分析如下:對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,

VC++ 提高C++程式執行效率10個簡單方法(其他語言程式參考)

對於每一個程式設計師來說,程式的執行效率都是一個值得重視,併為之付出努力的問題。但是程式效能的優化也是一門複雜的學問,需要很多的知識,然而並不是每個程式設計師都具備這樣的知識,而且論述如何優化程式提高程式執行效率的書籍也很少。但是這並不等於我們可以忽略程式的執行效率,下面

c#多執行以及Dispatcher.Invoke

主執行緒 private void Stabilitybutton_Click(object sender, RoutedEventArgs e) { for (int Nr = 0; Nr

WebDriverWait智慧等待查詢元素,提高程式碼的執行效率,不浪費時間,減少程式碼量

from selenium.webdriver.support.wait import WebDriverWait智慧等待10s之後獲取元素,獲取的是單個元素def find_element(self, locator):WebDriverWait(self.driver, 10).until(lambda

C#跨執行緒訪問winform控制元件的方法

方法一:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;  不推薦使用這種方式,禁止編譯器對跨執行緒訪問做檢查的方式實現。   方法二:使用delegate和invoke

C#(.net)中的一次連線資料庫執行多條sql語句(兩方法)

第一種方法: string str="server=.;uid=sa;pwd=111111;database=text_db";//連線字串 SqlConnection SCON = null;//連線物件 SqlCommand SCom=new SqlCommand();/

提高sql語句執行效率及索引

(1)選擇最有效率的表名順序(只在基於規則的優化器中有效):ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連線查詢,那就

提高shell指令碼執行效率

一、先說一下Shell指令碼語言自身的侷限性 作為解釋型的指令碼語言,天生就有效率上邊的缺陷。儘管它呼叫的其他命令可能效率上是不錯的。 Shell指令碼程式的執行是順序執行,而非並行執行的。這很大程度上浪費了可能能利用上的系統資源。 Shell每執行一個命令就建立一個新的程序,如果指令碼編寫者沒有這方面意識,

C++慎用define,以及相關的替代的方法

在C++中,巨集是一個非常好用的預處理功能,同時,它又有一些不好的地方,特別是用#define來實現macros,如果你這樣做的話,你肯定要為每個引數都加上小括號,否則你懂得。但是這樣仍然存在問題,說一個最近看到的例子: /*求兩個變數中最大的那個*/

C#中執行緒佔用記憶體過大解決方法

專案中用到了多執行緒,而且是1000執行緒併發執行,發現記憶體佔用過高,於是對專案裡用到的物件逐個測試,發現是執行緒物件佔用記憶體 Thread[] threads = new Thread[1000]; for(int i = 0; i<threa

[轉]C#子執行緒更新UI控制元件的方法例項總結

[我的評論:之前專案做的C#客戶端對於多執行緒修改UI使用的就是這個,找了好些時間才找到,其他很多都是沒有再函式中直接使用Action<>放置delegate的,而是在全域性下先放一個delegate的宣告,很頭疼,特轉] [來源:http://www.jb51

C語言創建符號常量的三方法;printf()和scanf()函數

c1、#indefine pi 3.1415926形式的宏定義2、const int MONTHS=12;這使得MONTHS成為一個只讀值。3、enum 枚舉類型4、printf()和scanf()函數使我們能夠與程序通信,他們被稱為輸入/輸出函數,(I/O函數)5、字符串、浮點數輸出的類型及介紹:實例程序:

c++中字符串反轉的3方法

reverse ++ include char 編寫 div IT 字符 LG 第一種:使用string.h中的strrev函數 #include <iostream> #include <cstring> using namespace std;

C++】int轉換為string的兩方法(to_string、字串流)轉載

int轉換成string的兩種方法 第一種是to_string函式,這是C++11新增的,使用非常方便,簡單查了下:C++11標準增加了全域性函式std::to_string,以及std::stoi/stol/stoll等等函式(這幾個就是string轉int,long,以及long lo

c# 獲取本地主機的ip地址三方法

第一種     取本主機ip地址        public string GetLocalIp()       &

C++中函式返回陣列指標的幾方法總結

因為陣列不能被拷貝,所以函式不能返回陣列。不過,函式可以返回陣列的指標或引用。返回陣列指標的方法有以下幾種:     1、方法一:使用類型別名。如下         typedef int arrt[10];//arrT是一個類型別名,它表示的型別是含有10個整數的陣列   

C/C++】求最大公約數的三方法

一、最大公約數與最小公倍數 最大公約數,屬於數論所探究的內容。 最大公約數可以通過下面的三種方法求出來。 最小公倍數呢,它與最大公約數的乘機為所求數之積。 比如求  x,y的最大公約數和最小公倍數 記住這個公式: x*y=最小公倍數*最大公約數 二、求最大公約