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用於非指標回傳一點意義都沒有
沒有留言:
張貼留言