看板 C_and_CPP 關於我們 聯絡資訊
我了解尚未綁定的virtual函數無法被inline 但是中文版的 Effective C++ 條款30中有一句話 "所有對virtual函数的调用也都會使inline落空" 卻讓我有點搞糊塗了 難道說類似這樣的程式碼不能被inline嗎? class Base { public: void inline_func() { ++counter_; virtual_func(); } //can not be inlined??! private: int counter_; virtual void virtual_func() = 0; }; 雖然inline_func()當中呼叫了virtual函數 但是編譯器要將對 inline_func() 的呼叫直接置換為 {++counter_; virtual_func();} 應該不會有困難才對吧? 畢竟編譯期尚未決定的應該是 "virtual_func()到底指向哪個函數" 這件事 而不是 "我想要呼叫virtual_func()" 的這個動作不是嗎? 還是說我把這句話的文意理解錯了......XD ====================================== 另外一個小小的問題是 如果我這樣寫: int a; inline int &reference_of_a() {return a;} 那麼這兩行: a = 100; reference_of_a() = 100; 編譯過後就會是完全一樣的嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.176.10.104
devilphoenix:inline:若編譯期無法綁定,則無法inline,不是完全 01/16 04:53
devilphoenix:沒可能,但是一般情況下無法inline。 01/16 04:54
pnpncat:但是 inline_func() 本身並不是一個虛函數啊 這樣也不行嗎 01/16 08:51
azureblaze:inline_func可以inline但是virtual_func不行 01/16 09:47
pnpncat:所以那句話不是說 "調用虛函數的函數" 不能inline 而是被 01/16 10:32
pnpncat:調用的虛函數不能inline囉?(但是這樣解釋又像是廢話XD) 01/16 10:34
Killercat:gcc編譯的時候開-Winline就可以讓你知道你宣告inline 01/16 17:28
Killercat:編譯器卻跟你說他沒辦法inline. VC也有類似的東西 01/16 17:29
Killercat:這應該比dump asm簡單一點 01/16 17:29
Killercat:至於理論上的說法,就是如devilphoenix說的 01/16 17:29
Killercat:另外,會問這問題的人通常...er... inline用太多了=P 01/16 17:30
pnpncat:只是單純好奇....我自己是不會inline超過兩行的函式XD 01/16 17:41
pnpncat:實際上用過的inline幾乎都是直接把getter寫在*.h檔造成的 01/16 17:42
pnpncat:我再開-Winline試試看吧 感謝指點^^ 01/16 17:43
Killercat:記得-O要設3以上 不然很多inline會被跳過 01/16 17:46