函式的效率

2021-04-20 11:36:29 字數 2209 閱讀 3386

一、

函式、巨集、內聯函式 1、

函式 呼叫函式的開銷大致可分兩個部分:傳遞引數的開銷和儲存當前程式上下文資訊所花費的開銷。對於傳遞引數的開銷而言,傳遞的引數越多開銷就越大;對於儲存當前程式上下文所花費的開銷而言,函式越複雜需要花費的開銷就越大。 2、

巨集 巨集在某種程度上可以代替函式,避免函式呼叫帶來的開銷。定義完巨集之後,在編譯程式時,用替代字串代替程式中的巨集。

對於巨集而言,雖然避免了函式呼叫帶來的開銷,但是增加了記憶體的開銷。因為在每個應用巨集的地方巨集都會展開。

另外,巨集易讀性比較差,容易出現問題。例如:

#define

max(a,b) ((a) < (b) ? (b):(a))

void

main()

我們會發現c的結果為12,因為巨集展開之後變為:((a++) < (b++) ? (b++) : (a++))並不是我們預想中的結果。故一般來講最好不使用巨集。

3、內聯函式

內聯函式是避免函式呼叫開銷的另一種方法,與巨集類似,在程式編譯是用內聯函式替換函式呼叫。但只能運用與

c++中,

c中無法使用。與巨集相比擁有引數型別檢查的優點。 在

c++類中,對於設定和讀取私有變數的函式設定為內斂函式,有助於提高函式的效率。

內斂函式的實現有兩種方式,第一種是在函式定義時使用關鍵字

inline

,第二種方式時在函式定義時與函式體一起定義。

4、遞迴與迭代

遞迴可以使程式顯得短小精悍,然而由於函式的多層呼叫,會嚴重影響程式的執行效率和記憶體使用效率。幸運的是在某種情況下,我們可以使用迭代來代替遞迴,避免函式呼叫開銷。

例子:遞迴版計算

n的階乘

long

factorial(

intn)

else

}

迭代版計算

n的階乘

long

factorial(

intn)

return

fac;

}二、函式的引數傳遞

函式引數的多少直接影響到函式呼叫的開銷,故編寫函式時需要選擇恰當的引數傳遞方式。我們可以用三種方式來傳遞函式:按值傳遞、按引用傳遞和通過全域性變數傳遞。

按值傳遞引數時,需要把所需傳遞的引數全部複製到堆疊中,當函式訪問該引數時相當於訪問區域性變數,為直接定址;按引用傳遞引數時,複製到堆疊中的時指標所包含的位址,當函式訪問該引數時相當於間接定址,增加了訪問引數的時間。通過全域性變數傳遞資料,避免了函式呼叫的開銷,擁有較高的效率,但會影響程式的可維護性,故非在非常明確的情況下,慎用全域性變數。

當需要通過函式修改引數值時,通過引用傳遞引數或通過全域性變數是不二的選擇。

當無需通過函式修改引數值時,對於較小的引數(占用位元組少)採用按值傳遞較之按引用傳遞較好,對於占用較多位元組的引數(結構體、類等)時,採用按引用傳遞的方式有助於減少函式引數傳遞的開銷。 三、

類物件的高效初始化 1、

類物件初始化

構造乙個物件類並設定其私有資料成員,通常有兩種方法,第一種是首先通過無參建構函式建立類物件,再通過私有資料設定函式設定成員資料的值;第二種是通過帶有引數的建構函式,同時建立類物件並設定私有資料成員的值。較第一種方法而言,第二種方式顯然擁有更高的效率,因為,呼叫私有資料成員設定函式同樣需要花費函式呼叫的開銷。故當我們能夠一次性完成建立與初始化時,最好採用第二種方案。

低效類物件初始化:

people peo;

peo.setname("john");

peo.setage(23);

peo.set***("man");

高效類物件初始化:

people peo("john", 23, "man");

2、基類初始化

當建立類物件時,若該類存在基類,則先呼叫基類的建構函式,在不採用基類初始化方式的情況下,系統呼叫基類的預設建構函式(無參建構函式)。此時若需設定基類的私有資料成員,必須呼叫基類的私有成員設定函式,從而增加函式呼叫的開銷。故在能夠同時提供基類私有資料成員的情況下,盡量採用基類初始化的方式初始化基類。

低效基類初始化:

student::student(string myname, int myage, int my***, int mygrade)

高效基類初始化:

student::student(string myname, int myage, int my***, int mygrade):

people(myname, myage, my***, mygrade)

sort函式的效率

最近本蒟蒻做了乙個實驗,測試sort的效率。我使用windows10 沒開 o2 系統試驗了三種排序方法 過載運算子,傳入函式指標以及傳入仿函式。以下n表示給多少個資料排序,對於每個n都測了三次 單位 ms n過載運算子 函式仿函式 500000 80140 80500000 80124 80500...

C STL copy函式效率分析

在c 程式設計中,經常會配到資料的拷貝,如陣列之間元素的拷貝,一般的人可能都會用for迴圈逐個元素進行拷貝,在資料量不大的情況下還可以,如果資料量比較大,那麼效率會比較地下。而stl中就提供了乙個專門用來進行容器元素拷貝的函式copy。copy的函式原型如下 templateoutitcopy in...

system與popen函式的效率

我們在程式中希望執行shell命令的時候首先想到的system函式,這個函式很簡單,但有乙個嚴重的問題,就是他的執行方式,效率上可能不高。include include include include include using namespace std timeval start,end dou...