2011-10-25 33 views
1

我工作的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(); 

} 

当我更改为优化释放设置为最大速度时,此功能被跳过。调试器进入函数并立即返回。

当我与调试设置运行或设置为禁用优化标志解除,功能运行良好。

可能的原因是什么? 我可以把一个预处理定义给力“不优化”这一功能,而其余代码得到优化

谢谢! 伊詹

+2

我觉得无聊的部分可能很重要。由于您正在从文件中读取,编译器必须假设副作用,并且可能无法优化读数。 –

+3

使用优化进行调试非常棘手,因为执行的代码不一定处于相同的位置/顺序。此外,您不一定依赖显示实际值的值。 – crashmstr

+0

- > 1无聊的部分主要包含文件路径连接和简单的strtok&strcmp调用。 - > 2我没有试图调试发布代码,但我可以看到它没有任何作用。 – iKatalan

回答

4

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

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

不过我看到一些可疑物品:你叫strtokNULL(预留 - 喜欢0或C++/C++ 11 nullptr)没有与有效的指针调用它。你知道strtok是破坏性的吗?

然后,使用一个字符指针索引的阵列,或推测(希望?)调用重载operator[]功能与char*参数。

由于这是C++,你的代码将是更清洁,更安全,可能更容易,如果你删除所有C风格的分析,并与stringfind/find_first_of /等做根据您的需要进行调试。

+0

我会改变strtok操作。它是为测试而建造的,并保持这样的状态。 'operator []'不是一个问题,map键是'std :: string',因此隐式转换被创建。 – iKatalan

5

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

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

+0

感谢您的回答。 我没有试图去调试“发布”代码,但是这个函数的输出很奇怪。该代码编译为发布模式(Optimization on),但该函数未得到执行。无论我调试它还是运行output.exe – iKatalan

+0

嗯,这很有趣。你怎么知道它没有被执行?我想你可以在那里保留这个编译指示,这样该函数就不会被优化。 – Chriszuma

+0

chromList和chromLine地图保持空白...我会尽量使用pragma来包装它,谢谢! – iKatalan