C++ 分析出现了\u迭代器\u base12::\u孤立\u我。这是怎么一回事?

C++ 分析出现了\u迭代器\u base12::\u孤立\u我。这是怎么一回事?,c++,profiling,C++,Profiling,我刚刚完成了一段占用太多时间的代码的分析。所讨论的代码从一些std::vectors和一个std::set创建了一个大的boost::graph,这些std::vectors和std::set经过多次排序和插入。然而,我惊讶地发现,大部分时间并没有花在排序或插入上,而是花在std::\u Iterator\u base12::\u Orphan\u me——据AMD CodeAnalyst报告,97.27%的时间花在排序或插入上。这个函数是什么?它似乎被调用了约2200次,总运行时间约为30秒

我刚刚完成了一段占用太多时间的代码的分析。所讨论的代码从一些std::vectors和一个std::set创建了一个大的boost::graph,这些std::vectors和std::set经过多次排序和插入。然而,我惊讶地发现,大部分时间并没有花在排序或插入上,而是花在
std::\u Iterator\u base12::\u Orphan\u me
——据AMD CodeAnalyst报告,97.27%的时间花在排序或插入上。这个函数是什么?它似乎被调用了约2200次,总运行时间约为30秒


CodeAnalyst并没有给我一个很好的调用堆栈,而且似乎在120个左右的字符后剪切名称,这与boost模板类型不匹配。如果有办法改进这一点(我是CodeAnalyst的新手),请这样说,我可能会提供更好的信息。

答案是在发布模式下运行探查器,请参阅

迭代器检查由
\u SECURE\u SCL
启用,执行作为最后一道安全防线的最小检查。。。由于默认情况下它在发布模式下启用,因此它努力将性能损失降到最低。因此,当它被启用时,尽管迭代器有指向其容器的指针,但容器没有指向其迭代器的指针

Orcas中的交换修复程序使每个标准容器都拥有一个额外的动态分配对象,富有想象力地称为“aux对象”每个容器都有一个指向其
aux
对象的指针,该对象有一个指向容器的指针。每个迭代器不再直接持有指向其父容器的指针,而是持有指向其父容器的
aux
对象的指针

性能问题是辅助
对象虽然不可避免不是免费的。每个标准容器现在都变大了,因为它必须持有指向其
aux
对象的指针。必须动态分配
aux
对象,以占用更多空间并占用更多时间。当从迭代器到其父容器时,
\u SECURE\u SCL
执行了双重间接寻址


您确定在评测之前以发布模式编译了代码吗?和调试模式相比,许多底层迭代器机制在发行版中都得到了优化。在性能调优方面,意外是意料之中的。程序正在进行I/O吗?如果是这样,那可能是97%的零。不管怎样,如果你想知道到底发生了什么,.迭代器已经被制作成一个非规范化的bfd,并带有指向其容器的反向指针。你可以关掉所有这些@迈克和裁判官:谢谢!不,我没有切换到释放模式(facepalm)。特别是Mike,链接的博客帖子内容非常丰富。你介意把它贴出来作为答复吗?(顺便说一句,切换到release,一个更大问题的运行时间从>40分钟减少到不到2秒…)我遇到了一个相关的问题:调试模式下的regex搜索操作在
Orphan_me()
方法处引发了堆栈溢出异常。切换到Release解决了这个问题(同时使regex模式变得更简单也会有所帮助)。