人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

C++程序設計最佳實戰

C++程序設計最佳實戰

更新時間:2022-07-14 文章作者:未知 信息來源:網絡 閱讀次數:

隨著計算機語言的發展,我們現在編寫一個程序越來越容易了。利用一些軟件開發工具,往往只要通過鼠標的拖拖點點,計算機就會自動幫你生成許多代碼。但在很多時候,計算機的這種能力被濫用了,我們往往只考慮把這個程序搭起來,而不去考慮程序的性能如何,程序是否足夠的健壯。而此節課的目的主要是介紹一些編碼的經驗,讓大家編寫的程序更加健壯和高性能。

  1、Prefer const and inline to #define

  在C++編程中應該盡量使用const和inline來代替#define,盡量做到能不用#define就不用。#define常見的用途有“定義常量”以及“定義宏”,但其中存在諸多的弊病。

  第一,查錯不直觀,不利于調試。Define的定義是由預處理程序處理的,作的是完全的文本替換,不做任何的類型檢查。在編譯器處理階段,define定義的東西已經被完全替換了,這樣在debug的時候就看不到任何的相關信息,即跟蹤時不能step into宏。例如,把ASPECT_RATIO用define定義成1.653,編譯器就看不到ASPECT_RATIO這個名字了。如果編譯器報1.653錯,那么就無從知道此1.653來自于何處。在真正編碼的時候應該使用如下的語句來定義: 

  static const double ASPECT_RATIO = 1.653;

  第二,沒有任何類型信息,不是type safe。因為它是文本級別的替換,這樣不利于程序的維護。

  第三,define的使用很容易造成污染。比如,如果有兩個頭文件都定義了ASPECT_RATIO, 而一個CPP文件又同時包含了這兩個頭文件,那么就會造成沖突。更難查的是另外一種錯誤,比如有如下的代碼:

  // in header file def.h

    #define Apple 1

    #define Orange 2

      #define Pineapple 3

     …

    // in some cpp file that includes the def.h

    enum Colors {White, Black, Purple, Orange};

  在.h文件中Orange被定義成水果的一種,而在.cpp文件中Orange又成為了一種顏色,那么編譯器就會把此處的Orange替換成2,編譯可能仍然可以通過,程序也能夠運行,但是這就成了一個bug,表現出古怪的錯誤,且很難查錯。再比如定義了一個求a與b哪個數大的宏,#define max(a,b) ((a) > (b) ? (a) : (b))

  int a = 5, b = 0;

    max(++ a, b);

    max(++ a, b + 10);

  在上面的操作中,max(++ a, b); 語句中a被++了兩次,而max(++ a, b + 10); 語句中a只加了一次,這樣在程序處理中就很有可能成為一個bug,且此bug也非常的難找。在實際編碼時可以使用如下的語句來做:

  template

    inline const T&

    max(const T& a, const T& b) { return a > b ? a : b; }

  2、Prefer C++-style casts

  在程序中經常會需要把一種類型轉換成另外一種類型,在C++中應該使用static_cast、const_cast、dynamic_cast、reinterpret_cast關鍵字來做類型轉換。因為這有以下好處,一是其本身就是一種注釋,在代碼中看到上面這些關鍵字就可馬上知道此處是進行類型轉換。二是C語言中類型轉換通常是很難進行搜索的,而通過關鍵字cast則可以很容易的找到程序中出現類型轉換的地方了。

  3、Distinguish between prefix and postfix forms of increment and decrement operators

  通常對于操作系統或編譯器自身支持的類型,prefix(前綴,如++i)與postfix(后綴,如i++)的效果是一樣的。因為現在的編譯器都很聰明,它會自動做優化,這兩者的匯編代碼是一樣的,性能不會有差別。但有時候也會有不同的,如一些重載了操作符的類型。下面是模擬prefix與postfix的操作過程,可以發現在postfix操作中會生成一個臨時變量,而這一臨時變量是會占用額外的時間和開銷的。

  // prefix form: increment and fetch

    UPInt& UPInt::operator++()

     {

      *this += 1; // increment

     return *this; // fetch

     }

    // postfix form: fetch and increment

     const UPInt UPInt::operator++(int)

     {

      UPInt oldValue = *this; // fetch

     ++(*this); // increment

      return oldValue; // return what was fetched

     }

  一般情況下不需要區分是先++,還是后++,但是我們在編寫程序的時候最好能習慣性的將其寫成++i的形式,如在使用STL中的iterator時,prefix與postfix會有相當大的性能差異。請不要小看這些細節,實際在編寫程序的時候,若不注意具體細節,你會發現程序的性能會非常的低。但要注意,雖然在大多數情況下可以用prefix來代替postfix,但有一種情況例外,那就是有[]操作符時,比如gzArray [++index] 是不等于 gzArray[index++]的。

[1] [2]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 邹城市| 阜城县| 桦南县| 临江市| 疏附县| 罗山县| 平定县| 敦化市| 梨树县| 沁水县| 平山县| 博野县| 酉阳| 县级市| 漳州市| 栾城县| 宁国市| 阿鲁科尔沁旗| 聂荣县| 阿拉善左旗| 台湾省| 盐亭县| 法库县| 东源县| 巴楚县| 阿拉善左旗| 开平市| 玉门市| 青田县| 富顺县| 城步| 红桥区| 罗源县| 辰溪县| 安图县| 内黄县| 松潘县| 邵武市| 隆化县| 天等县| 滕州市|