2

std::set所以你有这个从文件创建一个简单的程序:

#include <fstream>
#include <string>
#include <set>

int main()
{
 std::set<std::string> Sdictionnary;
 std::set<std::string>::const_iterator it = Sdictionnary.begin();

 std::ifstream file("french.txt"); // A file containing 200 000 lines
 std::string line;
 while(getline(file,line))
 {
  it  = Sdictionnary.insert(it, line);
 }
 file.close();
 return 0;
}

当您在 Visual Express 之外启动此程序时,它将在大约半秒内启动和关闭。

如果使用调试器在 Visual Express 中启动该程序,在 Debug 或 Release 模式下,它将在 20 到 25 秒后关闭。如果放置断点,则返回 0;你在退出前得到你的 25 秒。如果您在 25 秒内暂停程序,Visual Express 将转到 xmemory :

 void deallocate(pointer _Ptr, size_type)
  { // deallocate object at _Ptr, ignore size
  ::operator delete(_Ptr);
  }

这也发生在std::map. 但不是用std::unordered_setor std::vector。所以问题是,为什么 Visual Express 花费如此多的时间来使用某种关联容器(排序的容器??)释放内存?

4

2 回答 2

0

你在监视窗口有什么表情吗?

在观察表达式时,调试器必须定期检查程序是否进入了定义表达式的上下文。因此,它大大减慢了执行速度。在调试其他东西或什至另一个程序时输入的旧表达式可能保留在那里,所以请查看监视窗口并删除所有内容。

此建议也适用于条件断点。

于 2009-11-21T13:43:28.770 回答
-1

当使用带有提示迭代器的 insert() 函数时,您应该确保它实际上是一个提示。如果您在没有提示迭代器的情况下插入项目会发生什么?

Sdictionnary.insert(line);
于 2010-01-16T23:43:56.607 回答