C++不是C/C++


現在很多公司招程序員都是C/C++程序員。問:C/C++是一門什么語言呢?答:C中有C++, C++中有C。比如下面一段代碼:

   1:      int b[256];
   2:      memset(b, 0, sizeof(b));
   3:      for (int i = 0; i < 1000000; ++i)
   4:      {
   5:          for (size_t j = 0; j < 256U; ++j)
   6:          {
   7:              b[j] = 10 * j;
   8:          }
   9:      }

 

一.你還在用原始數組嗎?

我不明白,為什么有了vector,很多人寫C++代碼還是要去用原始的數組呢?(某些原因用不了vector?),

來看看vector帶來的好處:

1.定義即可初始化 上面第一行和第二行很明顯可以用一句 std::vector<int> b(256, 0) 替代,意思簡單明了。上面memset是不是很容易就寫成了memset(b, 0, 256)了呢?

2.vector變量中帶有size長度,循環時不容易越界。

3.vector及其方便的改變長度(resize)。而原始數組如果長度不夠,那得重新定義一個,然后手動copy到新的數組中,簡直麻煩到死了。如果對其封裝一下,那實際上又干了一次vector干的事情。

 

當然vector功能不僅僅如此,但是這次我是討論是替代原始數組的所帶來優勢。

上段代碼可以替換如下:

   1:      std::vector<int> a(256, 0);
   2:      for (int i = 0; i < 1000000; ++i)
   3:      {
   4:          for (size_t j = 0; j < a.size(); ++j)
   5:          {
   6:              a[j] = 10 * j;
   7:          }
   8:      }

大家可能會問到,效率呢?vector里面也是一個原始數組,封裝了一層,難道不比原始數組慢?我開始也是這么想,但測試結果大大出乎我的預料。

以上兩段代碼我測試了一下,原始數組甚至要慢一點。編譯器是g++4.3.2   -O2優化

vector版本    249 ms

原始數組版本 251 ms

二.你還在使用函數指針嗎?

很遺憾,C語言在設計的時候,函數並不是設計為第一類值。C++一開始也沒有,但自從boost::function(已加入標准庫,現在為std::function)出現之后,C++中函數已經基本可以充當第一類值使用了。

   1:  int g(int a)
   2:  {
   3:      return a * 10;
   4:  }
   5:   
   6:  int f(std::function<int (int)> callback, int a)
   7:  {
   8:      return callback(a);
   9:  }
  10:   
  11:  std::function<int (int)> callback = g;
  12:  f(callback, 1000);

C中函數指針的語法太復雜,我已經不記得用C怎么寫了。C++表示同樣的功能既簡單又清晰。

 

std::function配合lambda表達式或者std::bind更為強大,C++有了函數閉包的功能

   1:  int g(shared_ptr<int> count)
   2:  {
   3:      return ++(*count);
   4:  }
   5:   
   6:  int f()
   7:  {
   8:      std::function<int (void)> counter = std::bind(&g, std::make_shared<int>(0));
   9:      std::cout << count();
  10:      std::cout << count();
  11:  }

雲風在他的博客中說,沒有閉包的語言很痛苦,他還想方設法給C語言加上閉包。我想說,為何不用C++?

三.你還在new指針嗎?

指針是件核武器,殺敵一千自傷八百。有時指針傳來傳去,最后忘記了釋放。智能指針的出現是C++一次飛越。

   1:  auto a = std::make_shared<int>(0);

配合auto,c++代碼非常簡潔,性能怎么樣呢?我測試過,上面這段比int*a = new int慢一倍,相比其巨大優點,速度已經足夠快了。

shared_ptr並不是萬能良葯,使用不當會導致更嚴重的后果。例如,內存泄漏工具也無法檢查出來。所以,我認為share_ptr帶來的應該是一種語法上的工具,我們在使用它的時候應該更加理清楚變量的生命周期

 

C語言是一門偉大的語言,並不說明它是一門完美的語言。C++對其有很多改進,我們在用C++的時候不妨取其精華,去其糟粕。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM