推 kevinptt:被你這樣一講,感覺我自己有部分矛盾- - 11/12 00:10
→ kevinptt:像我IO就會用scanf/printf,array還是用C的方法寫 11/12 00:11
→ kevinptt:畢竟cout的效率不好,vector不見得比array快 11/12 00:12
我一直覺得 printf("", ...); 那裡要自己填 type 這件事很麻煩...XD
而vector光是一個push_back就讓我愛不釋手了,array的size也是個大麻煩
(這樣看起來我用cout跟vector好像只是想偷懶....)
→ kevinptt:但傳變數還是會用reference,不用複製感覺就比較有效率 11/12 00:13
據說 reference 的底層實作還是跟 pointer 是一樣的 (?)
我很怕那種 void foo(int a, int &b) 這類的程式
在函式裡如果寫 { a = 10; b = 20; }
看不出 a 不會影響外部值,而 b 會影響
如果是 void foo(int a, int *b) 的話
寫成 { a = 10; *b = 20; } 就會很明顯
→ kevinptt:喔?! reference不是直接把變數給它用,而pointer是再分配 11/12 00:17
void pointer(int *ptr) {
*ptr = 10;
}
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl $10, (%eax)
popl %ebp
ret
void reference(int &ref) {
ref = 20;
}
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl $20, (%eax)
popl %ebp
ret
在這個情況,兩者的實作幾乎是一樣的 XD
→ kevinptt:給指標一個記憶體再指向原始變數?(thinking) 11/12 00:17
推 kevinptt:原來還有這個優點!! 11/12 00:20
→ hilorrk:reference更像是T * const 對compiler來說更好做optimize 11/12 00:22
→ loveme00835:有的人習慣 define IN OUT 來標示輸入輸出, 不過今天 11/12 00:23
→ loveme00835:才被微軟陰 11/12 00:23
被陰是什麼意思呢?這裡我不太懂
我只知道 windows api 裡函式宣告喜歡使用 IN OUT,其實還挺清楚的
特別是 api 裡很多 void foo(......, OUT PVOID reult) 這種東西
有那個 OUT 可以知道那個參數是拿來擺結果的
→ hilorrk:vector和c-style array比不合適 要也跟C++0x或boost array 11/12 00:24
我和 C++0x 跟 boost 都不太熟...XD
※ 編輯: james732 來自: 114.35.184.77 (11/12 00:30)
→ loveme00835:VC會偷偷引入那些巨集, 給出不明確的錯誤訊息找錯找半 11/12 00:33
→ loveme00835:天 11/12 00:33
→ akasan:C++0x 已經是C++11了阿XD 11/12 00:33
→ diabloevagto:那個可以方便快速完成我的需求就用那個瞜~ 11/12 02:05
→ diabloevagto:個人是覺得OUTPUT一般都不是成是重點< 11/12 02:05
→ diabloevagto:平常就用COUT方便好用,需要特殊輸出就用PRINTF 11/12 02:06
確實output不是重點了,特別是 console 程式的 output XD
推 mingtai1:個人認為reference的好處在於無法傳null,但pointer可以 11/12 02:16
有的時候反而覺得是缺點耶 XD
※ 編輯: james732 來自: 114.35.184.77 (11/12 10:02)
→ diabloevagto:自由度比較沒這麼高,但是安全性高滿多 11/12 16:17
→ angleevil:reference好處在幾個地方,一.好操作.二.用在捕捉 11/12 21:03
→ angleevil:exceptions. 而且reference用在函式參數上好操作 11/12 21:04
→ james732:原來如此,因為我幾乎不會用C++的exception,所以不懂 11/12 21:05
→ angleevil:不用搞混*是提取或乘法. 但是一個例外是有傳遞有null 11/12 21:06
→ angleevil:就算不高興還是要用pointer. 而且當使用array時. 11/12 21:06
→ angleevil:reference可以得到array真正大小.而非pointer的大小 11/12 21:07
→ james732:我真的覺得reference不能傳null是一件很討厭的事...XD 11/12 21:08
→ james732:我又不喜歡程式裡偶爾用pointer,偶爾用reference 11/12 21:08
→ angleevil:james732 所以auto_ptr和stl某部份就是在解決這個 11/12 21:10
→ james732:auto_ptr也有屬於它的麻煩…C++似乎還不可能脫離pointer 11/12 21:11
→ angleevil:stringstream對我麻煩點是,很少書講解清楚這功用 11/12 21:13
→ angleevil:james732 我覺得auto_ptr或是boost的ptr系列都是問題 11/12 21:14
→ angleevil:回到最原始的問題,c/c++不會自動清理空間.因此之後 11/12 21:14
→ angleevil:在怎樣創造這些,依舊問題多多.何況auto_ptr幾乎是用在 11/12 21:15
→ angleevil:class上,我目前的經驗是為了解決例外發生時,可以釋放空 11/12 21:17
→ angleevil:間.只是不能用在array.實在很討厭.此狀況下.就直接用vec 11/12 21:18
→ angleevil:至於boost到底要不要學,我的想法是等vc和gcc都支援 11/12 21:21
→ angleevil:C++0x在去學.不要去寫一個不能跨編譯器的程式比較好 11/12 21:22
→ angleevil:雖然很多人會覺得這是廢話.但是一個程式要盡量有跨平台 11/12 21:23
→ angleevil:能力.也是一個好習慣.儘管很多時候是無法做到 11/12 21:23
推 mingtai1:撇開編譯器未支援的boost不看, boost很多東西蠻好用的 11/12 21:31
→ mingtai1:Callback用到實在是會上癮..雖然我不很懂但我會拿來用 XD 11/12 21:32
→ angleevil:我是沒機會用c++.而且沒有一個網站已經整理boost的使用 11/12 21:34
→ angleevil:一直不太想玩它.只是我注意到hashmap,這個好東東就是 11/12 21:35