优化使函数立即返回而不是执行

时间:2011-10-25 18:00:43

标签: c++ c visual-studio-2010 optimization release

我正在研究VS 2010 express并尝试做一些文件阅读和解析工作

我的功能是这样的......(我放弃了无聊的部分)

void SomeClass::SomeFunc(char *ALName, std::map<...> *chromList, std::map<...> *chromLine)
{
    ifstream file;
    char tmpBuff[500];
    char tmpBuff2[500];
    char fileName[350];
    char tmp[350];
    char *pch;
    char *pch2;

    .....

    file.open(fileName);

    while ( file.getline( tmpBuff, 500 ) ) 
    {
        ....
        if ( some_condition == 0 )
        {
          pch2 = strtok( NULL, "," );
          pch = strtok( NULL, "," );
          (*chromList)[pch2] = do_some_work( atoi(pch), tmpBuff2 );
          strcpy( tmp, get_chrom_line( tmpBuff2 ) );
          (*chromLine)[pch2] = tmp;
        }
    }

    file.close();

 }

当我更改为Release with Optimization设置为Maximum speed时,将跳过此功能。 调试器进入函数并立即返回。

当我运行Debug设置或Release并将Optimization标志设置为disabled时,该函数运行正常。

可能的原因是什么? 我是否可以使用预处理器定义强制对此函数执行“无优化”,同时优化其余代码

谢谢! 伊丹

2 个答案:

答案 0 :(得分:5)

您永远不应该尝试调试优化代码。它显示的行号很少与实际执行的内容相匹配,而忘记了读取局部变量。这就是“调试”和“发布”模式的原因。

但是,如果你真的想,try this使Visual Studio不能优化该功能。您还可以将该函数放在单独的源文件中,并以调试模式进行编译。

答案 1 :(得分:4)

你确定该函数实际上是被跳过的吗?调试器不是简单地让它看起来被跳过了吗?

如果它确实没有被执行,那么几乎可以肯定你有未定义的行为,当你没有优化时,它会如何工作,并且编译器(可能正确地)在优化模式下将其优化为非工作代码。

这就是说我看到了一些有问题的内容:您使用strtok(旁边 - 在C ++ / C ++ 11中更喜欢NULL0)来调用nullptr而不调用它用有效的指针。您是否意识到strtok具有破坏性?

然后使用字符指针索引数组,或者假设(希望?)使用operator[]参数调用重载的char*函数。

由于这是C ++,如果删除所有C样式的解析并使用stringfind / {{1}执行此操作,您的代码将更干净,更安全,并且可能更容易调试} / etc取决于您的需求。