03 10月 2007

身為一個Programmer必須注意的事 --- i++ & ++i 效率是一樣的嗎!?

i++ & ++i 寫起來不一樣、意思不一樣,沒想到連效率也不一樣!!! 最近研讀侯捷大師翻譯的「Exception C++」讀到其中這一段,其實還滿令我驚訝的,因為我本人平時寫code的習慣,就是習慣性的將for loop最後的++寫成i++,沒想到i++比++i 還沒效率....

這個是平常寫for loop的習慣... 如果MAX_SIZE 一大,所造成的效率問題,就會比較明顯了~

for( int i=0 ; i < MAX_SIZE ; i++ )
{ .... }

為什麼說++i 比 i++還要有效率呢? 就字面上的意義而言:
‧++i => 先將i+1,再使用 i 的值~
.i++ => 先使用i的值,再將 i 的值+1

重點就是在先加或是後加的問題~先加再用,則compiler背後的運作,就是將 i 的值+1然後再使用 i。而如果是先用再加呢,compiler勢必先create出一個temp(暫時性的變數)存放著i的值,然後才將 i 的值+1,實際上使用的卻是temp的值。所以實作 i++所必須付出的代價,就是多create出一個temp的變數,以及temp變數的constructor。

在這邊我實作了一個名為INT的class,它的功能就跟一般的int型別是一樣的~而其中的operator ++很明顯地就表達出先加與後加所必須付出的代價...

#include<iostream>
#include<list>

using namespace std;

class INT{
public:
INT():_value(0){}
INT(int a):_value(a){}
INT(const INT & i):_value(i._value){}//copy constructor

//為了cout所實作出來的operator
friend ostream & operator <<(ostream & out, const INT & i){
out << i._value;
return out;
}

//i++
INT operator ++(int t){
INT temp(_value);//!!! 必須create出一個temp的變數!!!
this->_value++;
return temp;
}

//++i
INT operator ++(){
this->_value++;
return *this;
}

void operator =(int i){
_value=i;
}

private:
int _value;
};

int main(int argc, char**argv){
INT i;
cout << "i==1" <<endl;
i=1;
cout << "++i == " << ++i << endl;

i=1;
cout << "i++ == " << i++ << endl;
return 0;
}

沒有留言: