2013-04-30 85 views
1

在我計劃的一部分,我的代碼:爲什麼我的程序進入if語句及其相應的else語句?

if(cameraName == L"AVT Prosilica GT2750") { 
     mCamera = new camera_avtcam_ex_t(); 
    } else if(cameraName == L"QImaging Retiga 2000R\\4000R") { 
     mCamera = new camera_qcam_ex_t(); 
    } 

當我建立了我的程序,以便cameraName默認爲L「AVT Prosilica公司GT2750」(我的調試器會顯示這是它的價值) ,它進入if語句並運行mCamera = new camera_avtcam_ex_t();,但是當我進入下一個執行的行時,我的調試器直接跳到行mCamera = new camera_qcam_ex_t();並執行它。考慮到if/else語句的性質,這可能如何發生?

注意:如果我用另一個簡單的else語句替換else,則會看到相同的行爲。

+2

你在調試發佈版本嗎? – pstrjds 2013-04-30 17:27:13

+5

重新編譯失敗是我想到的第一件事情。 – dasblinkenlight 2013-04-30 17:27:32

+0

也許是雜散分號? – 2013-04-30 17:30:34

回答

3

您看見這在試圖調試發佈版本

嘗試調試「調試」版本。你應該看到你期待的行爲。在調試優化構建時,行不一定與源代碼「排隊」。對於你所知道的,優化器決定最好是執行這兩個,如果不需要的話就扔掉一個。

注意 - 我並不是建議優化器這樣做,我只是說這是可能的,而且您可能實際上正在看到下一個正在執行的行。優化器可以自由地重新排序的代碼,循環展開,傳播完成常量,刪除變量添加臨時工,等,等,等

編輯 - 更多的想法
當你下到硬件級的東西可以得到真正的重新排序。硬件可能會選擇執行分支的雙方,然後才能確定應該採取哪一種方式,以便在需要時立即做好準備。它會這樣做,即使它意味着拋棄其他工作,因爲這可能會產生更快的執行。

+0

我不敢相信任何編譯器或硬件都會在評估「if」條件之前在這兩個塊中執行代碼。 'camera_qcam_ex_t'可能有副作用,並且語言保證它不會被「運行」。但是,您的第一條語句可能仍然是正確的,但調試器只是指向錯誤的代碼行。 – 2013-04-30 17:50:00

+2

也可能兩個構造函數非常相似,編譯器決定共享一些通用代碼。爲了找到肯定的答案,下降到彙編語言,看看它在做什麼。 – 2013-04-30 17:50:17

+0

@NateHekman - 我只是說它可以 - 我認爲不會,但優化器可以做出瘋狂的事情。或者正如雷蒙德指出的那樣,它們是相似的,所以它拉出了一些通用的代碼。代碼執行的想法然後被扔掉被稱爲「推測執行」 - http://en.wikipedia.org/wiki/Speculative_execution – pstrjds 2013-04-30 17:52:12