【发布时间】:2011-10-25 18:00:42
【问题描述】:
我正在开发 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();
}
当我将优化设置为最大速度更改为发布时,将跳过此功能。 调试器进入函数后立即返回。
当我在调试设置或优化标志设置为禁用的情况下运行时,该功能运行良好。
这可能是什么原因? 我可以放置一个预处理器定义来强制这个函数“无优化”,而其余的代码得到优化
谢谢!! 伊丹
【问题讨论】:
-
我认为无聊的部分可能很重要。由于您正在从文件中读取,编译器必须承担副作用并且可能不会优化读取。
-
启用优化的调试很棘手,因为执行的代码不一定在相同的位置/顺序。此外,您不一定要依赖显示真实值的手表值。
-
-->1 无聊的部分主要包含文件路径连接和简单的 strtok 和 strcmp 调用。 -->2 我没有尝试调试发布代码,但我可以看到它什么也没做。
-
也许编译器认为 some_condition 永远不会等于 0,所以它省略了该部分。我们可以看看“some_condition”部分吗?
-
可能的问题:“some_condition”以某种方式设法被扣除为始终非零。或者可能一些缓冲区溢出,并覆盖您的指针。结果,您将元素添加到地图中,而不是您认为自己添加的那些地图。该错误也可能在“do_some_work”函数中,它会破坏您的堆栈。
标签: c++ c visual-studio-2010 optimization release