C ++:为什么'删除'内存比'新'内存慢得多

时间:2014-05-30 18:30:12

标签: c++

我对C ++很陌生。我发现operator delete比operator new慢得多。 我在MS Visual Studio 2012下运行以下代码,操作系统是Windows 7 64位。

输出结果为:


0 19 ....................

问题已经解决了。这是因为我从IDE运行它。但现在我很好奇为什么从调试器运行它会产生如此大的差异?

#include <iostream>
#include <string>
#include <time.h>

using namespace std;

#define N 10
typedef unsigned long DWORD;
typedef int * PINT;

const DWORD n = 2E6;

time_t time1, time2, time3;

int main()
{   

    PINT *  p = new PINT[n];

    cout << "-----------------" << endl;

    time (&time1);

    for (DWORD i = 0; i < n; i++)
    {
        p[i] = new int [N];
    }

    time (&time2);

    cout<<time2-time1<<endl;

    for (DWORD i = 0; i < n; i++)
    {
        delete [] p[i];
    }

    time (&time3);

    cout<<time3-time2<<endl;


    delete [] p;

    cout << "................." << endl;

}

1 个答案:

答案 0 :(得分:1)

当您在VS上构建程序作为调试版本时,您获得的堆不同于执行版本构建时的堆。调试堆包含许多安全措施,旨在帮助您查找常见的编程错误。这些技术包括:

  • 在已分配的块之间放置警卫(哨兵),并在释放该块时检查它们是否仍然完整。
  • 使用模式(通常是负数和未对齐的指针)填充释放的块,以便在释放后使用内存的程序可能会触发问题。
  • 在分配块之前和/或之后遍历堆,以确保所有防护和自由模式完好无损。

这些特殊功能倾向于在free而不是new上调用,因此free速度较慢(至少对我而言)并不令人惊讶。

不要担心。在发布版本free上足够快,可以满足您的任何需求。