我正在开发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();

 }

当我将“发布”的“优化”设置为“最大速度”时,将跳过此功能。
调试器进入函数并立即返回。

当我在“调试”设置下运行,或者在“优化”标志设置为“禁用”的情况下运行“释放”时,该功能运行良好。

可能是什么原因呢?
我可以在此代码的其余部分得到优化的同时,在该函数上添加预处理器定义以强制“无优化”吗?

谢谢!!
伊丹

最佳答案

您确定该函数实际上已被跳过,并且调试器不是简单地使其看起来已被跳过吗?

如果确实没有执行它,那么几乎可以肯定,您有未定义的行为,可以在未优化的情况下按您希望的方式工作,并且编译器(可能是正确的)以优化模式将其优化为非工作代码。

那就是说,我看到了一些可疑的项目:您使用strtok调用NULL(除了-在C++ / C++ 11中更喜欢0nullptr),而没有使用有效的指针进行调用。您是否知道strtok具有破坏性?

然后,您可以使用字符指针为数组建立索引,或者大概(希望吗?)使用operator[]参数调用重载的char*函数。

由于这是C++,因此,如果您删除所有C样式的解析,并根据需要使用stringfind / find_first_of / etc进行处理,则代码将更加简洁,安全,并且可能更易于调试。

关于c++ - 优化使函数立即返回而不是执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7893698/

10-11 02:52