两种C ++分配方法之间有什么区别

时间:2014-02-19 20:58:17

标签: c++ memory fragment allocation

以下两个分配有什么区别:

for (I = 0; I < 10000000; i++)
    P = new CMyObject;

并且

P = new CMyOjbect[10000000];

第一个分配方法会在分配期间导致更多碎片并消耗更多实际内存吗?

4 个答案:

答案 0 :(得分:3)

其中一个独立分配10000000个元素。原则上,对象可以分散在整个虚拟存储空间中。另一个分配一个包含10000000个连续元素的数组。

在第一种情况下,你必须分别在每个实例中调用delete(你不能这样做,所以你有内存泄漏。)在第二种情况下,你需要调用{{1}在delete []上取消分配整个数组。

答案 1 :(得分:2)

与每个内存分配相关的开销取决于操作系统以及是否使用调试符号构建代码。

无论如何,每个分配都有正的开销。因此,在一次调用中分配N个对象的开销大大少于每N次分配一个对象,特别是当N为10000000时。

看一下以下代码:

#include <stdlib.h>
#include <iostream>

struct Object
{
   Object() : i(0) {}
   int i;
};

int N = 1000000;

void test1()
{
   Object* p = new Object[N];
}

void test2()
{
   for (int i = 0; i != N; ++i )
      Object* p = new Object;
}

int main(int argc, char** argv)
{
   int i = atoi(argv[1]);
   if ( i == 1 )
   {
      test1();
   }
   else
   {
      test2();
   }

   std::cout << "Enter a number: ";
   std::cin >> i;
   return 0;
}

平台:cygwin32,编译器:没有调试符号的g ++

  Memory used for test1:  4,760K
  Memory used for test2: 16,492K

平台:Windows 7,64位,编译器:没有调试符号的Visual Studio 2008

  Memory used for test1:  4,936K
  Memory used for test2: 16,712K

平台:Windows 7,64位,编译器:带调试符号的Visual Studio 2008

  Memory used for test1:  5,016K
  Memory used for test2: 48,132K

还需要进行额外的簿记,以确保分配的内存被释放。这个练习的目的是展示与两种分配内存方式相关的开销成本。

答案 2 :(得分:1)

在第一种情况下,您将分配10000000个对象,但在覆盖以前分配的对象时,您将只有最后一个对象可用。 ---&GT; 内存泄漏

在第二种情况下,您将分配一个10000000个对象的数组。您可以删除

delete [] P;

答案 3 :(得分:0)

每个分配都会消耗一些时间并使用(我认为这可能是可以避免的)一些额外的内存。因此,方法1肯定会变慢,很可能会使用更多内存,并可能导致更多碎片。