精華區beta Programming 關於我們 聯絡資訊
※ 引述《HZYSoft.bbs@ptt.cc (PCMan 2004)》之銘言: > 其實通常不一定是這麼回事,也未必有 overhead 是的,這種 size 上的 overhead 「未必」會發生, 然而目前大多數的編譯器在 class 本身狀況複雜時幾乎會有 overhead, 目前我手上沒有 MSVC 編譯器, 但依經驗和印象來說 MSVC 在多重和虛擬繼承的情形, 並無法避開 member function size overhead 的發生, 這可能需要請有 MSVC 編譯器的人實驗看看。 > 在 inline 的時候可以避免 overhead,且就算沒 inline 不見得比較慢 在使用 member function pointer 時, 和 function object(或稱 functor)的 operator() 可被 inline 情形不同, 由於無法確定會 bind 的對象, 只要有點複雜的程式就會造成無法 inline 的狀況, 幾乎沒有 inline 的可能性。 > 以下舉相當常用的 Visual C++ 為例 > member function 和 一般的 static function 其 pointer 大小完全一樣 寫到這裡,我特地用 google 搜尋了一下, 您可以參考看看 http://www.codeproject.com/cpp/FastDelegate.asp, 裡面的 Implementations of Member Function Pointers 段落中有一張表, 若其內容為真,您可能要重新考慮一下如此肯定的說法是否有問題。 > 差別只在 calling convention,一個是 C 的 calling convention > 另一個是 this call,也就是 call 的時候把 this pointer 放入 ECX register > 其實這效果跟 fast call 相當類似,function pointer 本身和 static function 無異 > void gtk_window_set_title(register GtkWindow* window, gchar* title); > void GtkWindow::set_title(gchar* title); > 上面兩行實際執行的效果和 overhead 基本上完全一樣,而早期的 C 不能 inline > 所以 C++ 有時不但不會比較慢,而且經常能略勝 C 一籌 > 一般來說 Getter 和 Setter function 都會寫成 inline,無 overhead > C++ 的 function 會有 overhead 的地方主要在 virtual function, > 而非所有 member function 都會,事實上大多 member function 和 C 沒差 > 以上雖然沒有明文規範,但是編譯器基本上不會選擇用比較有 overhead 的方式實做 這部分的爭議倒是比較不那麼大。 > 這些東西教授不知道很正常,換一個好的演算法往往勝過你省下上千個 overhead > 研究演算法的人不需計較這種實做細節,那對他們沒有意義。 這牽涉到我第一篇回文的重心,您可能沒有注意到, 就是原發文者說在學校學不到東西, 而我列出一些原因告訴原發文者不應該期待學校會教什麼, 然後列出一些教授誤人子弟的言論。 另外,通常教 C++ 語言這門課的教授不應該是專門做演算法的, 因為「程式語言」和「程式設計」這兩門課並不適合這類教授進行教學, 除非是年輕時代對 C++ 很有興趣之後才轉型走向演算法的老教授, 但依 C++ standard 制訂的年代來說,這種老教授應該不存在。 再來,會被此類 overhead 拖累的演算法一般來說不是偏重效能考量, 而是偏重空間使用考量,這也是近幾年來新興的論文題目之一, 由於記憶體容量越來越大,對 PC 以上等級的系統研究節省記憶體意義已經不大, 很多論文已經轉向記憶體受限環境下如何節省空間的使用, 譬如現在被台灣政府炒到翻的嵌入式系統與 SoC 設計裡的軟體部分, 這類 overhead 常在研究生要跑數據丟 paper 前才被注意到, 不少例子是為了畢業在論文數據上動手腳, 國外倒是會有老實招認然後投去 conference 的情形。 上面兩段是分別就教育面和學術研究價值面做探討, 最後這裡就是實務面的考量了, 一般來說 C++ 程式除了 OOP 外還注重一般化(也就是 generic), 為求避免發生「寫死」的情形, 聽信或教人「xxxxx 的 size 在 xxx 一定是 xxxx bytes」是很不好的, 我曾經看過有人製作 pointer 容器時, 使用一般 function pointer size 初始化每個元素的大小, 然後試圖將 member function pointer 和一般 function pointer 塞在一起, 這位仁兄後來的確用很奇怪的方式達到他的目的了, 不過很遺憾的是之後他拿去別的平台無法編譯他的程式。 至於為何要做 pointer 容器?印象中是為了實作 thread manager... 後來這位仁兄看到 C# 的問世以及 delegate 的到來, 快樂的棄 C++ 投向 C# 的懷抱當中... 又,如果希望能夠充分發揮 C++ 的所有威力而又毫無阻礙, 我個人建議是使用 Comeau C++,雖然它要錢(可是不貴), GCC 目前在 4.1 版重寫了 C++ parser,試圖將 template 的支援做得更好, GCC 至今仍然毫無計畫實現 export 的功能, MSVC 的狀況我不清楚,事實上我幾乎沒有用過 MSVC 寫過 C++ 程式。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-156-105.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩