2013-04-30 60 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