C語言和C++哪個效率更高?老司機3句話告訴你答案
很多小伙伴都會有這樣的疑問,C語言和C++執(zhí)行效率上哪一個更高呢?
針對這樣的問題,今天我們就一起來看一下吧!
1.開發(fā)效率
當(dāng)代碼量比較小的時候,使用c語言可以很方便的就完成代碼的開發(fā)和維護,但是當(dāng)代碼量達到一定數(shù)目以后,c++面向?qū)ο蟮乃枷氲膬?yōu)勢就很好的體現(xiàn)出來了,這種思想使代碼重用更加高效。
2.執(zhí)行效率
從語言特性角度上來看,C++是C的超集。
在(C++) - C的這部分語言特性中有很多會降低執(zhí)行效率。一個例子是dynamic_cast,執(zhí)行一個dynamic_cast要消耗100-300個CPU cycles,因為機器要跳到一段特別的snippet(一小段程序)去檢查type inheritance。
除了語言特性,通常比較語言也會比較它們的標(biāo)準(zhǔn)數(shù)據(jù)庫。
例如C++中std::sort函數(shù)肯定比C語言中的qsort快(因為template function的優(yōu)點),但是C++中的iostream系列又比C的printf系列慢幾乎3倍,但是由于C++標(biāo)準(zhǔn)庫功能比C語言大得多,許多時候我們可以用較少的開發(fā)時間就在C++中實現(xiàn)相同的算法。
另外,不同編譯器對語言的執(zhí)行效率影響也很大。
3.C++相對于C的抽象,相較于直接用C的實現(xiàn),效率如何呢?
異常:對于GCC C++用的dwarf異常比C里面模擬實現(xiàn)用的longjmp時間效率要高,畢竟他記錄了哪些callee-saved 寄存器是需要恢復(fù)的,用空間換了些時間。
返回結(jié)構(gòu)體對象:C++支持對于非POD執(zhí)行返回拷貝優(yōu)化,C99結(jié)構(gòu)體由于都是POD,有的版本依然不能支持返回拷貝優(yōu)化。
虛函數(shù):這種抽象,C實際有2種實現(xiàn),一種就是照搬C++的實現(xiàn),顯然效率不會有太多差別;第二種是讓每個對象持有每個虛函數(shù)的函數(shù)指針,初始化慢些且對象或者虛函數(shù)多了也特別費內(nèi)存,但是調(diào)用虛函數(shù)時少了一次間接尋址,而且還可以運行期修改這個函數(shù)指針的值。
C++函數(shù)模版(operator <) vs C函數(shù)指針定義concept(qsort的比較函數(shù)指針):本質(zhì)是生成多份實例用空間換時間 VS 用函數(shù)調(diào)用解耦可復(fù)用代碼和不可復(fù)用代碼從而避免可復(fù)用代碼產(chǎn)生多份實例,前者占用內(nèi)存多點但少了些許跳轉(zhuǎn)對流水線友好,后者占用內(nèi)存少點但多了些函數(shù)跳轉(zhuǎn)對流水線不友好。