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

C++ 优化使函数立即返回,而不是执行,c++,c,visual-studio-2010,optimization,release,C++,C,Visual Studio 2010,Optimization,Release,我正在开发VS2010Express,并试图做一些文件读取和解析工作 我的函数是这样的。。。(我把无聊的部分弄掉了) void SomeClass::SomeFunc(char*ALName,std::map*chromList,std::map*chromLine) { ifstream文件; char-tmpBuff[500]; 煤焦tmpBuff2[500]; 字符文件名[350]; char-tmp[350]; char*pch; char*pch2; ..... 打开(文件名); wh

我正在开发VS2010Express,并试图做一些文件读取和解析工作

我的函数是这样的。。。(我把无聊的部分弄掉了)

void SomeClass::SomeFunc(char*ALName,std::map*chromList,std::map*chromLine)
{
ifstream文件;
char-tmpBuff[500];
煤焦tmpBuff2[500];
字符文件名[350];
char-tmp[350];
char*pch;
char*pch2;
.....
打开(文件名);
while(file.getline(tmpBuff,500))
{
....
如果(某些条件==0)
{
pch2=strtok(空,“,”);
pch=strtok(空,“,”);
(*chromList)[pch2]=做一些工作(atoi(pch),tmpBuff2);
strcpy(tmp,get_chrom_line(tmpBuff2));
(*铬线)[pch2]=tmp;
}
}
file.close();
}
当我更改为“释放”,并将优化设置为“最大速度”时,将跳过此功能。 调试器进入函数并立即返回

当我在调试设置下运行或在优化标志设置为disabled的情况下发布时,函数运行正常

可能的原因是什么? 我可以在剩下的代码得到优化的同时,在这个函数上添加一个预处理器定义来强制“不优化”吗

谢谢!!
Idan

您不应该尝试调试优化的代码。它显示的行号很少与实际执行的行号匹配,并且忘记了读取局部变量。这就是为什么会有“调试”和“发布”模式


但是,如果您真的希望,请不要让VisualStudio优化该功能。您还可以将该函数放在一个单独的源文件中,并在调试模式下编译。

您不应该尝试调试优化的代码。它显示的行号很少与实际执行的行号匹配,并且忘记了读取局部变量。这就是为什么会有“调试”和“发布”模式


但是,如果您真的希望,请不要让VisualStudio优化该功能。您还可以将该函数放在一个单独的源文件中,并在调试模式下编译它。

您确定该函数实际上被跳过了,并且调试器没有简单地使它看起来被跳过吗

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

也就是说,我看到了一些有问题的项目:您使用
NULL
调用
strtok
(在C++/C++11中,优先选择
0
nullptr
),而不使用有效指针调用它。你知道strtok的破坏性吗

然后使用字符指针对数组进行索引,或者(希望如此)使用
char*
参数调用重载的
运算符[]
函数


<>因为这是C++,你的代码会更干净,更安全,如果您删除所有C风格的解析,并根据需要使用
string
find
/
find\u first\u
/等等来完成,那么调试可能会更容易。

是否确实跳过了该函数,并且调试器没有简单地让它看起来被跳过

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

也就是说,我看到了一些有问题的项目:您使用
NULL
调用
strtok
(在C++/C++11中,优先选择
0
nullptr
),而不使用有效指针调用它。你知道strtok的破坏性吗

然后使用字符指针对数组进行索引,或者(希望如此)使用
char*
参数调用重载的
运算符[]
函数


<> P>因为这是C++,如果你删除所有的C风格解析,并且按照你的代码,请按照“代码>字符串S/<代码>和<代码>查找< <代码> > />代码> FordFixStI/<代码> /等,你的代码将会更干净、更容易调试。由于您是从文件中读取,编译器必须承担副作用,并且可能不会优化读取。使用优化打开进行调试是很棘手的,因为执行的代码不一定在相同的位置/顺序。此外,您不必依赖显示实际值的监视值。-->1无聊的部分主要包含文件路径连接和简单的strtok&strcmp调用。-->2我没有试着调试发布代码,但我可以看到它什么也不做。也许编译器认为某个_条件永远不等于0,所以它省略了该部分。我们可以看一下“some_条件”部分吗?可能的问题:“some_条件”以某种方式被扣除,总是非零的。或者一些缓冲区溢出,并覆盖您的指针。因此,您可以将元素添加到地图中,但不能添加您认为可以添加的那些地图。这个bug可能就在“dou_some_work”函数中,它会破坏你的堆栈。我认为无聊的部分可能很重要。由于您是从文件中读取,编译器必须承担副作用,并且可能不会优化读取。使用优化打开进行调试是很棘手的,因为执行的代码不一定在相同的位置/顺序。此外,您不必依赖显示实际值的监视值。-->1无聊的部分主要包含文件路径连接和简单的strtok&strcmp调用。-->2我没有试着调试发布代码,但我可以看到它什么也不做。也许编译器认为某个_条件永远不等于0,所以它省略了该部分。我们可以看一下“some_条件”部分吗?可能的问题:“some_条件”以某种方式被扣除,总是非零的。或许如此
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();

 }