gpt4 book ai didi

c++ - 使用 if 语句的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 08:08:10 25 4
gpt4 key购买 nike

我正在使用 OpenSceneGraph 开发一个应用程序,我在 if 语句中遇到了一些奇怪的行为。我不确定它是否特定于 API,因为它对我来说在任何层面上都毫无意义。

代码:

if ( !fileAddList_.empty() )
{
sg::FileStampThread::instance()->addFiles( fileAddList_ );
fileAddList_.clear();
}

地点:

  • fileAddList_:自定义对象的静态 vector ,用于维护文件名

  • FileStampThread:OpenThreads 对象的实例

  • addFiles(): 线程中保存文件列表的方法传递给它的对象

以上代码在我的应用程序中实现了热加载。 FileStampThread 实例连续运行,检查传递给它的文件名的时间戳。一旦标记更改,文件名将保存到另一个列表并传回以重新加载。

奇怪的是,当我启用这段代码时,场景图的更新遍历(当这段代码被执行时)会大大减慢,即使没有要添加的文件(也就是说,即使 fileAddList_ 为空) .更新遍历时间因此增加了一个数量级。

但是,如果我注释掉对 sg::FileStampThread::addFiles 的调用,减速就会消失。然而,我在 Debug模式下陷入了调用,它从未被执行。

所以,我很困惑:为什么条件测试失败时,条件测试中的一行代码会影响我的程序执行速度,而且从表面上看,它从未执行过?

作为旁注,我怀疑它可能与将变量声明为静态变量有关,因此我尝试将其声明为全局变量(使用 extern),以达到相同的效果。


针对以下一些评论进行的编辑:

  • 线程是 OpenThreads 对象的一个​​实例。没有特定于 MS 的东西,在这里。该实例是静态的。

  • addFiles() 未模板化

  • 我用其中的代码测试了循环。我注释掉了这些行交替。我绝对肯定包含 addFiles()电话是罪魁祸首。

  • 调试与发布没有区别,将代码插入不幸的是,单独的函数没有任何改变。

  • OSG 是高性能的,关于错误预测的评论可能是就在。即将进行的研究...

FileStampThread 类的代码:

void sg::FileStampThread::addFiles( sg::AssetFileList& files )
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock( contentMutex_ );

for ( sg::AssetFileList::iterator it = files.begin(); it != files.end(); ++it )
{
if ( boost::filesystem::exists( (*it).getPath() ))
fileList_.push_back( (*it) );
}
};

最佳答案

尝试移动代码:

sg::FileStampThread::instance()->addFiles( fileAddList_ );
fileAddList_.clear();

在一个单独的函数中查看问题是否仍然存在。很难接受正在发生的事情,发布和调试版本的行为相同吗?

关于c++ - 使用 if 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9804030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com