(具體內容有時間補上去。)
/***************************************************************************************************************************
這裏先記錄開發中碰到的一個問題。
背景介紹:
OpenGL + Win32 SDK編程,使用C++語言。
使用VS2008,使用Debug生成或者Release生成。
一個父類GLWindow,該類有虛方法Method1(), Method2(), ... MethodN()。
兩個子類Win1, Win2都單繼承自GLWindow,分別重載了Method1(), Method2(), ... MethodN()。
在主程序中,動態生成兩個子類各一個實例。
GLWindow * pWnd1 = new Win1();
GLWindow * pWnd2 = new Win2();
我想看到多態特性。
現象:
在使用Debug生成時一切正常,使用Release生成時有問題,如下:
調用pWnd1.Method1(), pWnd2.Method1(),運行正確,能夠進入各自的方法。
調用pWnd1.Method2(), pWnd2.Method2(),運行正確,能夠進入各自的方法。
調用pWnd1.Method3(), pWnd2.Method3(),結果pWnd1.Method3()總是進不去,直接進入pWnd2.Method3()方法 【使用單步跟蹤~~】
... (其他的方法有的正常,有的也出現上述問題)
分析:
觀察後發現,Method3方法在Win1和Win2子類中實現時的代碼是一模一樣的,所以其中一個的代碼被優化掉了!(其實,在機器看來,執行效果是一樣的,可是程序員看到就要納悶了)
如果改動了其中任何一個的實現,則運行過程是對的。如果不改動代碼,使用Debug模式結果總是正確的。
我嘗試修改Debug和Release兩種配置,更改了很多選項都不能解決問題。
總結:
1. 使用Release和Debug模式是有很多區別的,編譯器和連接器提供的選項需要不斷的去熟悉。
2. 雖然上面的現象不影響程序運行結果,但是總歸有點不祥之兆。也許是我大驚小怪了,只是IDE不夠智能?亦或是編譯連接程序已經給優化掉了?至此我尚不知原因。
3. 但我還是發現了Release模式時可能會影響程序運行結果的一種情況。使用"assert(DoSomething());"這句代碼,將會導致DoSomething()不被執行。需要使用替代語法"BOOL ret = DoSomething(); assert(ret);"。這個問題也曾經困擾了我多時。
***************************************************************************************************************************/