※ 引述《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