精華區beta Programming 關於我們 聯絡資訊
※ 引述《tinlans.bbs@whshs.cs.nccu.edu.tw (汀)》之銘言: > ※ 引述《Oscar0121.bbs@ptt.cc (java新手)》之銘言: > > tinlan大大您好 感謝您為我們解惑 > > 版上也常拜讀您的文章 受益不少^^ > > 但是此例小弟實驗結果 怎麼都還是4 byte呢 > > 編譯環境 VC6 console mode > > 哪裡有問題呢?編譯環境沒設定好嗎 > > #include <iostream> > > using namespace std; > > class X{ > > void foo(void){} > > }; > > int main() > > { > > void (X::*ptr)(void); > > cout<<sizeof(ptr)<<endl; > > int* pt=new int(6); //一般pointer > > cout<<sizeof(pt)<<endl; > > return 0; > > } > > 兩者皆輸出 4 > 事實上標準並沒有規定 member function pointer 的 size, > 各家編譯器有自己的實作方式, > MSVC 在如此簡單的 class 來說的確是 4 bytes, > 這個現象與 class 的繼承關係複雜度有關, > 您可以嘗試製造複雜一點的 class 繼承關係, > 再觀察它的 member function pointer size, > 應該會發現多重繼承和虛擬繼承等狀況下可能又會出現不同的 size。 正確 在使用MSVC的時候要小心,你必須要了解optimization在做些什麼 不然最好把optimization開掉 以member function pointer為例子 若開啟optimization,則宣告在不同的環境會有不同的大小,所以容易有bug產生 如果不知道optimization在做什麼,選"most general always"比較好 -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: g924388.HSIN-A.ab.nthu.edu.tw