C++ 删除[]是否比新建[]慢?

C++ 删除[]是否比新建[]慢?,c++,vector,heap,C++,Vector,Heap,我已经在一个简单版本的向量上使用gprof运行了测试,该向量在堆上分配内存(实际上不是动态的-仅用于测试目的)。问题是,查看结果,我发现“new[]”和“delete[]”之间存在巨大的差异,因为我实际上向向量插入了值(使用[]操作符)。 通过上述操作,我得到了如下结果: % cumulative self self total time seconds seconds calls s/call s/cal

我已经在一个简单版本的向量上使用gprof运行了测试,该向量在堆上分配内存(实际上不是动态的-仅用于测试目的)。问题是,查看结果,我发现“new[]”和“delete[]”之间存在巨大的差异,因为我实际上向向量插入了值(使用[]操作符)。 通过上述操作,我得到了如下结果:

%   cumulative   self              self     total           
  time   seconds   seconds    calls   s/call   s/call  name    
  0.92      0.55      0.01        1     5.03     5.03  MyVector::~MyVector()
  0.00      0.55      0.00        1     0.00     0.00  MyVector::MyVector(int)
但如果我只是分配内存并删除它,而不向向量插入值,它们 以同样快的速度工作:

%   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
0.00      0.09     0.00        1     0.00     0.00  MyVector::MyVector(int)
0.00      0.09     0.00        1     0.00     0.00  MyVector::~MyVector()
我的猜测是,当使用“new[]”时,编译器(在我的例子中是gcc)不会真正分配内存,而且只有在需要时才会分配内存(比如使用[])。当它需要摧毁这个物体时,它已经 取消分配每次访问期间分配的所有内存(使用[])

我找不到这方面的任何文档,也许有什么我不知道的。我会很高兴的 如果有人愿意分享关于这个问题的知识

编辑:我添加了我使用的代码。 感谢迄今为止的所有答案:

class MyVector
{
public:

        MyVector(int size) { _data = new int[size]; };
        ~MyVector() { delete[] _data; } ;

        int& operator[](int index) { return _data[i]; };

 private:
       int* _data;
       int _size;     
 };


    And the test:

int main() {

      MyVector v(1000000);

      for (int j = 0 ; j<20000 ; ++j) {
        for (int i = 0; i<1000000; ++i) {
          v[i]= i; //If i remove this line, destructor and constructor work just as fast
        }
     }

      return 0;
}
类MyVector
{
公众:
MyVector(int size){{u data=new int[size];};
~MyVector(){delete[]_data;};
int&运算符[](int索引){return_data[i];};
私人:
int*_数据;
内部尺寸;
};
以及测试:
int main(){
MyVector v(1000000);

对于(int j=0;j您是正确的。
new[]
并不会在所有系统上立即分配内存。例如,在Linux上,您会得到一个指针,指向只有在您尝试实际使用时才会分配的内存。因此:

something = new[N];
delete[] something;
其中,
something
是指向内置类型的指针,基本上是禁止操作的

(这可能会破坏标准一致性,因为
new
应该在没有更多可用内存时抛出(或者在nothrow版本中返回NULL)。但事实就是这样;Linux几乎将其视为拥有无限内存。)

请注意,这仅适用于内置类型,因为除非您要求,否则它们不会使用
new[]
构造默认值。其他类型会调用其默认ctor,因此会访问内存。为了进行测试,请尝试访问最后一个元素:

something = new[N];
something[N-1] = some_Value;
delete[] something;

这是否会改变您的gprof结果?如果是,则延迟分配很可能是您看到的结果的原因。

您能显示一些代码吗?
[]
不插入或分配任何数据。
调用1
意味着在测试过程中只调用了一次这些函数,我会质疑这些数字的值。至少调用几千次。所有这些数字意味着什么?@默认-一个答案是数字被描述了。另一个答案是数字没有意义样本大小为1。正确但无意义。
new[]
不分配实际内存,但它绝对会分配地址空间。昂贵的部分是查找一个连续的地址空间块。由于MMU的原因,实际内存不会连续映射。@m其他人是否确定地址空间分配不会延迟到使用前?最初返回的指针可以映射到除非最近的标准更改了(最近我在C++中没有太多的工作),所以调用基于数组的代码>新< /COD>运算符需要调用数组中每个元素的默认构造函数。这要求它不仅找到(或构造)一个连续的地址空间,但它也引用新对象来构造它们。对我来说,这听起来很像分配。@D.Shawley你不是只有通过
something=new[N]();
才能得到它吗(注意末尾的
()
)@NikosC.:绝对正确。指针不能映射到任何位置,因为指针必须指向不能与任何其他地址范围重叠的地址范围。如果已分配了
0x1040
,则
new[]
对于大小为
0x50
的数组可能不会返回
0x1000
。这将导致16字节重叠。