1

在我的程序的一部分,我有代码:

    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 if,就会看到相同的行为。

4

1 回答 1

3

由于尝试调试发布版本,您看到了这一点

尝试调试“调试”版本。您应该看到您所期望的行为。在调试优化的构建时,这些行不一定与源代码“对齐”。就你所知,优化器决定最好同时执行这两个,如果不需要,就扔掉一个。

注意 - 我并不是建议优化器这样做,我只是说这是可能的,并且您实际上可能会看到接下来要执行的行。优化器可以自由地重新排序代码、展开循环、传播常量、删除变量、添加临时变量等。

编辑 - 额外的想法
当你进入硬件级别时,事情可能会真正重新排序。硬件可以选择执行分支的两侧,然后再确定应该采用哪个分支,以便在需要时立即准备好答案。即使这意味着放弃其他工作,它也会这样做,因为这可能会产生更快的执行速度。

于 2013-04-30T17:41:13.740 回答