Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么解除分配很慢?_C++_Memory Management_Set - Fatal编程技术网

C++ 为什么解除分配很慢?

C++ 为什么解除分配很慢?,c++,memory-management,set,C++,Memory Management,Set,我有一个问题在网上找不到答案 我有一套声明如下: set<unsigned int> MySet 设置MySet 我插入了由mersenne twister生成的一百万个随机数。随机生成和插入非常快(对于一百万个数字,大约一秒钟),但释放速度非常慢(1.5分钟) 为什么解除分配如此缓慢?我没有为集合使用任何自定义析构函数。在发布模式下编译代码 这有两个作用 它开启了一些优化,这肯定会有所帮助 此外,对于调试和发布,内存管理库也不同。 库的调试版本是为了允许调试而构建的,它们维护额

我有一个问题在网上找不到答案

我有一套声明如下:

set<unsigned int> MySet
设置MySet
我插入了由mersenne twister生成的一百万个随机数。随机生成和插入非常快(对于一百万个数字,大约一秒钟),但释放速度非常慢(1.5分钟)


为什么解除分配如此缓慢?我没有为集合使用任何自定义析构函数。

在发布模式下编译代码

这有两个作用

  • 它开启了一些优化,这肯定会有所帮助
  • 此外,对于调试和发布,内存管理库也不同。
    库的调试版本是为了允许调试而构建的,它们维护额外的信息(如标记取消分配的内存)。所有这些额外的处理实际上都需要成本
    • 两个版本的库的目标完全不同。发布版本绝对针对速度进行了优化,调试版本针对恢复和调试进行了优化

  • 请注意,此信息是关于DevStudio的。

    可能是因为以释放为代价优化分配更有意义,因为许多应用程序分配时没有释放,但反之亦然。我自己也看到过类似的模式,在一个混合调用
    malloc
    free
    的应用程序中(而不是一次分配和取消分配)

    我从未编写过堆分配器,所以我不知道是否还有比这更深层的技术原因。解除分配时,必须找到并合并相邻的空闲块。所以这项工作完全不同

    100万个小的
    free()
    的90秒听起来相当慢。我从来没有真正编程过Windows,所以我不能说这是否异常,但系统应该可以做得更好


    问题的解决方案可能只是在程序退出之前跳过释放对象。您可以尝试从
    std::allocator
    派生自定义分配器,这使得
    deallocate
    成为禁止操作。

    我不知道您使用的是什么操作系统,但可能是在释放每个块后内存正在重新压缩。您是否在启用优化的情况下编译-O3Windows 7x64。在VisualStudio2010下编译。有没有办法加快释放速度?在释放模式下构建(应该可以打开大多数释放模式),然后重新计时。@Seebee:新的时间是什么?