两种C++分配方法有什么区别
What's the difference between the two C++ allocation methods
以下两种分配之间的区别是什么:
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肯定会更慢,很可能会使用更多的内存,并可能导致更多的碎片。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?