7
struct test_struct
{
    test_struct() {}
    ~test_struct() {}
};

#include <vector>
#include <memory>
#include <cstdio>

int main()
{
    printf("ctor begin\n");
    {
        std::vector<std::unique_ptr<test_struct>> test_vec;
        const int count = 100000;

        for (auto i = 0; i < count; i++) {
            test_vec.emplace_back(new test_struct);
        }
        printf("dtor begin\n");
    }
    printf("dtor end\n");
}

我正在使用 VS2010,发现了一些可笑的性能问题。上面的代码在调试和发布版本 (ctrl+f5) 中运行良好,但是当附加调试器时 (f5),dtor 对 unique_ptr 类的调用速度非常慢。结果机器代码已经相当优化,所以我不认为这是编译器问题而不是调试器问题,但我不知道如何处理它。我的问题是

  • 这个问题能在你的机器上重现吗?
  • 这种行为的原因是什么?
  • 有什么解决方法吗?
4

1 回答 1

6

速度变慢是由释放内存时发生的内存检查引起的。但是,这是一个特殊的系统/调试器级别的堆,不是您可以在程序中控制的任何东西。

关于这个问题有一篇很棒的文章。总结一下:你必须设置一个环境变量来禁用它!

幸运的是,您可以从项目设置中的调试选项中为项目设置特定于项目的环境变量,以便环境变量仅应用于您的程序。

我用这个简化的程序来测试:

#include <iostream>
#include <memory>
#include <vector>

int main()
{
    std::cout << "ctor begin" << std::endl;
    {
        std::vector<std::unique_ptr<int>> test_vec;

        for (unsigned i = 0; i < 100000; i++)
            test_vec.emplace_back(new int);

        std::cout << "dtor begin" << std::endl;
    }
    std::cout << "dtor end" << std::endl;
}

通过设置_NO_DEBUG_HEAP=1为环境变量(系统范围,我不推荐,或者通过调试选项),无论是否附加调试器,代码运行的时间大致相同。

于 2012-05-21T06:51:40.810 回答