unordered_map在Visual Studio中的神秘行为
Mysterious behavior of unordered_map in Visual Studio
我想在VS2010 c++下在unsigned int
索引处存储~3,000,000个double
值。为此,我使用std::tr1:unordered_map<unsigned int, double>
。不幸的是,当我尝试存储值2^21时,抛出了一个异常(好像只有2^21-1的空间,即某些索引只能使用20位)。在存储值之前,我尝试了rehash
,这也不起作用。
最后,我完成了一些非常基本的测试程序(它甚至显示了一点不同的行为,但无论如何):
std::tr1::unordered_map<unsigned int, float> mapOut;
//mapOut.rehash(SOMESIZE);
for (unsigned int i=0; i<3000000; i++)
{
if (i%1000==0) std::cout << i << std::endl;
mapOut[i] = 0.0;
}
有些情况我检查了:
1)如果我根本不重新哈希,程序在根据i == 32000
(最终是2^15)输出后需要很长时间的休息,然后继续执行i == 262000
(2^18)。在那里,它永远保持(100% CPU负载,内存不增加)。
2)如果我执行rehash(1000)
,它会到达i == 65000
(2^16)并且永远保持(CPU负载100%,内存不增加)。
3)如果我执行rehash(3000000)
,循环成功结束,但程序永远不会退出——也就是说,显然析构函数有问题。
那里发生了什么,更重要的是:我该怎么办?!
非常感谢您的帮助!连接上的以下错误似乎与您的问题有关:Visual c++: std::unordered_map析构器在调试配置中的性能
同样的问题不仅发生在析构函数中,而且在调整unordered_map
的大小时也会发生。如果启用了迭代器调试,这似乎与使迭代器失效有关。
他们说VC11已经修复了。这里也列出了一些变通方法,但我还没有尝试过。
解决调试和发布版本的性能问题的一个非常简单的方法是在"配置选项/C/c++/预处理器/预处理器定义"下的项目选项中设置_SECURE_SCL=0
和_HAS_ITERATOR_DEBUGGING=0
,这将完全禁用所有迭代器调试。但是,这也会禁用一些安全检查,因此您需要在自己的代码中更加小心。我相信这两个版本已经是默认的了,所以你不需要在那里做任何改变。
这似乎与示例代码的问题有关。我不确定最初的问题,因为你没有说抛出了什么异常。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 使用一个考虑到std::map中键值的滚动或换行的键
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio 2017 STL 可视化工具失败了一个 std::map<MyIntrusivePtr, std::tuple<....> >
- Visual Studio xtree _STL_VERIFY(this->_Getcont(), "cannot increment value-initialized map/set ite
- Visual Studio 11 使用 std::map 的编译时错误