C++代碼優化
本文檔列舉了游戲服務器開發過程中應當注意的一些規范,以保證我們服務器代碼具有更高的可讀性、可維護性以及更高的穩定性和運行效率。
1.???定義struct必須要在構造函數中對所有成員變量進行初始化。
這樣可以確保一個對象生成時,其所有成員變量都有可知的固定的初值,而不是系統分配的初值。另外,盡量使用初始化列表的方式對復雜數據類型的成員變量進行初始化,這樣可以只調用一次拷貝構造函數,不需要調用賦值操作符,代碼更高效。
2.???自增自減操作符在不是必要的時候全部使用前置操作符。
++i比i++具有更少的匯編指令,雖然編譯器優化后這兩條語句可能完全相同,但是養成良好的代碼風格也很重要。
3.???無符號整數與0比值直接使用==判斷。
不需要使用<=,因為無符號整數永遠不可能小于0。同樣的,判斷一個無符號整數>=0也是沒有意義的。
4.???浮點數的比較。
。
5.???使用typedef對較長的類型定義進行重命名。
這樣可以使該類型使用地方的代碼更加有可讀性,也減少了代碼出錯的可能。
6.???減少局部變量不必要的初始化。
這種情況大部分是寫代碼時粗心造成的。主要是為了節省性能(個人感覺初始化還是必要的)
7.???非基本數據類型作為函數參數不要使用值傳遞。
非基本數據類型是指int、float、char這些C/C++基本類型之外的數據類型,比如std::string和自己定義的struct等。非基本數據類型一般是由多個基本數據類型組成的,如果值傳遞會進行大于4個字節的內存拷貝,嚴重影響效率。而函數參數無外乎有兩種情況,一種是函數內部不會改變參數的值,另一種的函數內部需要改變參數的值。前者使用const引用或者const指針,后者使用引用或指針,就能解決所有需求,因此非基本數據類型以值傳遞的形式作為函數參數是沒有必要的。另外,基本數據類型作為函數參數如果函數內部不需要改變值的話建議直接值傳遞。
8.???類成員變量數組大小避免直接使用數字。
定義一個常量作為數組的大小使代碼更易維護,也能減少數組越界等bug的出現幾率。
數據結構優化
一)????選擇合適的算法和數據結構
1)如果固定大小,并且隨機訪問就用數組
2) 如果數據大小不固定,并且涉及大量的插入和刪除操作,使用鏈表
3)如果涉及海量數據,并且要求高效的查找就用map
二)查表
1)客戶端程序經常用到的sin cos等值可以再初始化的時候計算出(0-360度)的值保存在表里,用的時候直接使用 (空間換時間)
運算符優化
1)取余用與(&)替換
2)乘與除2的倍數可以用位移操作來替換
3)除法可以用乘法替代
語句優化
一)順序語句的優化
1)相同功能的代碼放在一個語句塊,避免出現開頭定義了一個變量
幾百行代碼后才引用
2)盡量多用中間變量保存代碼塊重復引用的值
二)if swtich 語句的優化
嵌套if把執行幾率小的判斷放在前邊
Switch
使用跳轉表
switch語句執行的時候并不是和if elseif 一樣傻傻的一個一個去執行,而且把左右跳轉地址保存起來,如果是連續的只需要一個跳轉表,如果case不連續的就需要兩個挑戰表,從表A就是上邊0x4140a8地址找到實際的跳轉偏移看到了把1-3是跳轉偏移是,后邊3-100全部是04然后在存儲實際的跳轉地址0x414094+偏移找到跳轉地址,過去
三)循環語句的優化
1)循環展開
4)多重循環的時候一定要注意內循環的效率,因為內循環執行的次數是最多的。
AStyle 格式化代碼
&AStyle
C:\ProgramFiles (x86)\Microsoft Visual Studio 8\Common7\Tools\AStyle.exe
-A1 -s4 -c-K -w -m0 -M80 -j -H -p -U -Y -N -k2 $(ItemDir)$(ItemFileName)$(ItemExt)
$(ItemDir)
C++ 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。