我正在开发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中更喜欢0
或nullptr
),而没有使用有效的指针进行调用。您是否知道strtok
具有破坏性?
然后,您可以使用字符指针为数组建立索引,或者大概(希望吗?)使用operator[]
参数调用重载的char*
函数。
由于这是C++,因此,如果您删除所有C样式的解析,并根据需要使用string
和find
/ find_first_of
/ etc进行处理,则代码将更加简洁,安全,并且可能更易于调试。
关于c++ - 优化使函数立即返回而不是执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7893698/