天天看點

C和C++哪個效率更高?

前幾天發了一篇推送涉及c和c++,評論區大家對c和c++哪個效率更高這個問題比較感興趣,今天小編就和大家一起讨論一下這個問題!

開發效率

當代碼量比較小的時候,使用c語言可以很友善的就完成代碼的開發和維護,但是當代碼量達到一定數目以後,c++面向對象的思想的優勢就很好的展現出來了,這種思想使代碼重用更加高效。

執行效率

從語言特性角度上來看,C++是C的超集。

在(C++) - C的這部分語言特性中有很多會降低執行效率。一個例子是dynamic_cast,執行一個dynamic_cast要消耗100-300個CPU cycles,因為機器要跳到一段特别的snippet(一小段程式)去檢查type inheritance。

除了語言特性,通常比較語言也會比較它們的标準資料庫。

例如C++中std::sort函數肯定比C語言中的qsort快(因為template function的優點),但是C++中的iostream系列又比C的printf系列慢幾乎3倍,但是由于C++标準庫功能比C語言大得多,許多時候我們可以用較少的開發時間就在C++中實作相同的算法。

另外,不同編譯器對語言的執行效率影響也很大。

C++相對于C的抽象,相較于直接用C的實作,效率如何呢?

  • 異常:對于GCC c++用的dwarf異常比C裡面模拟實作用的longjmp時間效率要高,畢竟他記錄了哪些callee-saved 寄存器是需要恢複的,用空間換了些時間。
  • 傳回結構體對象:C++支援對于非POD執行傳回拷貝優化,C99結構體由于都是POD,有的版本依然不能支援傳回拷貝優化。
  • 虛函數:這種抽象,C實際有2種實作,一種就是照搬C++的實作,顯然效率不會有太多差别;第二種是讓每個對象持有每個虛函數的函數指針,初始化慢些且對象或者虛函數多了也特别費記憶體,但是調用虛函數時少了一次間接尋址,而且還可以運作期修改這個函數指針的值。
  • C++函數模版(operator <) vs C函數指針定義concept(qsort的比較函數指針):本質是生成多份執行個體用空間換時間 VS 用函數調用解耦可複用代碼和不可複用代碼進而避免可複用代碼産生多份執行個體,前者占用記憶體多點但少了些許跳轉對流水線友好,後者占用記憶體少點但多了些函數跳轉對流水線不友好。

一句話總結,不能簡單地說C和C++哪個效率更高。它們各有各的特性,如何利用它們各自的特性生成運作效率優秀的程式,是一個程式員應該思考的事情。