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

What's the difference between the two C++ allocation methods

本文关键字:什么 区别 方法 C++ 分配 两种      更新时间:2023-10-16

以下两种分配之间的区别是什么:

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

P = new CMyOjbect[10000000];

第一种分配方法会在分配过程中导致更多的碎片,并消耗更多的实际内存吗?

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

在第一种情况下,您必须在每个实例中分别调用delete(不能这样做,因此会出现内存泄漏。)在第二种情况中,您需要在P上调用delete []来取消分配整个数组。

是。

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

无论如何,每个分配都有正的开销。因此,在一次调用中分配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++,无调试符号

用于测试的内存1:4760K用于测试的内存2:16492K

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

用于测试的内存1:4936K用于测试的内存2:16712K

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

用于测试的内存1:5016K用于测试的内存2:48132K

还必须进行额外的记账,以确保分配的内存被释放。这个练习的目的只是演示与两种内存分配方式相关的开销。

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

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

delete [] P;

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