2009年4月5日 星期日

C/C++的Const(中)

const在函數裡可以做到保護的作用

void add(Card c);

像這樣一段函式,直接用call-by-value的方式傳遞

如果Card是個非常大的結構,那overhead將會非常的高,而且高到不行(里昂調)

因為他是用copy的方式整個copy一份到stack裡面使用

假如你的c大小是1MB 那麼光作這1MB的copy(包括init跟記憶體規畫)跟傳遞就耗費無數時間

所以通常都會選擇只傳他的指標

void add(Card& c);

這樣子只需要傳遞Pointer(4 byte),而不須整份copy(n byte 過去)

但是有時候我希望傳進去的東西不要被修改,我希望他唯讀

這時候const就小兵立大功了

void add(const Card& c);

改成這樣,就會告訴compiler 傳進來的參數是不可更改,如果做了任何指派的動作就會編譯不過

void add(const Card& c){c=new Card;}\\X

包括把他傳進另一個函式或者是回傳


void add(const Card& c){test(c);}
void test(Card& c){}


此時儘管test沒做什麼,仍然會編譯不過 因為compiler不確定test是否會修改到c

但是改成如下就可以


void test(const Card& c){}\\告訴compiler test不會修改c
\\or
void test(Card c){}\\不共用記憶體 但是失去意義


同樣的,你也不可能回傳c的記憶體位置
Card* add(const Card& c){return &c;}\\X
因為要避免你在函式外面修改他

Card* a=add(c);
a.x=XXX;

但是可以用回傳值使用const的方式解決

const Card* add(const Card& c){return &c;}
const Card* a=add(c);

其中const Card* 代表回傳的是一個常數,a必須也是個常數才能接收


Note:

const Card add();

const用於非指標回傳一點意義都沒有

沒有留言: