[問題] c++ virtual method的故事

看板C_and_CPP (C/C++)作者 (逞強是我的專長)時間13年前 (2013/04/11 23:54), 編輯推噓2(2010)
留言12則, 5人參與, 最新討論串1/1
最近看到LLVM裡面的某一點coding standard讓我一直想不透 If a class is defined in a header file and has a vtable (either it has virtual methods or it derives from classes with virtual methods), it must always have at least one out-of-line virtual method in the class. Without this, the compiler will copy the vtable and RTTI into every .o file that #includes the header, bloating .o file sizes and increasing link times. 大意就是,在一個定義在header file裡的class有virtual method or 它繼承的base class有virtual method的話, 就必須至少定義一個virtual method 沒有的話compiler會copy vtable 和RTTI到每個有include這個header的.o檔 我的問題是,為什麼有一個virtual method compiler就不copy了? 所以vtable會放哪? 想知道整個故事是到底怎麼回事 有去看過more effective c++ item24 但是還是不太懂 只知道compiler copy是要解決vtable放哪的問題 請問有人知道嗎 感謝 ==== 知道了 http://www.angelfire.com/weird2/darkmoon/MEC/MI24_FR.HTM 裡面提到 A more common design is to employ a heuristic to determine which object file should contain the vtbl for a class. Usually this heuristic is as follows: a class's vtbl is generated in the object file containing the definition (i.e., the body) of the "first non-inline non-pure" virtual function in that class. If all virtual functions in a class are declared inline, the heuristic fails, and most heuristic-based implementations then generate a copy of the class's vtbl in every object file that uses it. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.112.113

04/12 00:12, , 1F
你自己的翻譯漏了最重要的一個字 out-of-line
04/12 00:12, 1F

04/12 00:25, , 2F
純猜測。假設有3個虛函式,當其中一個虛函式定義在 a.cpp
04/12 00:25, 2F

04/12 00:27, , 3F
則 compiler 會覺得複製 vtable 可能不完整,就不複製了?
04/12 00:27, 3F

04/12 00:28, , 4F
相對的,當3個虛函式都可以從標頭檔取得,則資訊必然充足
04/12 00:28, 4F

04/12 00:29, , 5F
應該是全都 inline 了所以要在這個編譯單元內找到 vtable
04/12 00:29, 5F

04/12 00:34, , 6F
out-of-line = non-inline, 我還自動忽略那個字..
04/12 00:34, 6F
※ 編輯: a9228097 來自: 61.230.112.113 (04/12 00:38)

04/12 00:47, , 7F
所以他是指,從一開始 vtbl 就只想放在一處儲存而已
04/12 00:47, 7F

04/12 00:48, , 8F
只是挑選策略失敗,就乾脆海派點,每個有用到的地方都塞
04/12 00:48, 8F

04/12 23:37, , 9F
我 virtual function 從來不 inline,這東西能 inline 嗎?
04/12 23:37, 9F

04/12 23:39, , 10F
所以當初我在 LLVM 看到那條完全無視,感覺是說廢話。
04/12 23:39, 10F

04/13 00:17, , 11F
我是看到source裡有"virtual method anchor"才看到這個
04/13 00:17, 11F

04/13 00:18, , 12F
規定, 才疑惑為啥要這樣規定
04/13 00:18, 12F
文章代碼(AID): #1HPjozM0 (C_and_CPP)
文章代碼(AID): #1HPjozM0 (C_and_CPP)