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)、unique_ptr クラスの dtor 呼び出しが耐えられないほど遅くなります。結果のマシン コードはかなり最適化されているため、デバッガーの問題ではなくコンパイラーの問題であるとは思いませんが、対処方法がわかりません。私の質問は

  • この問題はあなたのマシンで再現できますか?
  • この動作の理由は何ですか?
  • 回避策はありますか?
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 に答える