C++ C++;对象块分配与单个分配
块分配与单个对象分配的主要区别是什么。比方说C++ C++;对象块分配与单个分配,c++,memory,C++,Memory,块分配与单个对象分配的主要区别是什么。比方说 int iCount = 5; int i = 0; while(i < iCount) { f = new foo(); i++; } ////////////////// foo* f = new foo[iCount]; inticount=5; int i=0; while(i
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
//////////////////
foo* f = new foo[iCount];
inticount=5;
int i=0;
while(i
第二种方法能为我节省一些内存空间吗?。
我听说我们分配的每个对象都有16个管理字节。因此,块分配将仅使用一个标头保护。这是真的吗?您所做的每一次分配都会分配分配头(有时也会分配一些页脚保护结构),这取决于分配器使用的算法,您可以找到其中一种算法的描述 分配数组时,将使用
sizeof(element)*count
作为参数调用分配器(主要是malloc()
),并使用一个头结构将整个数组分配为一个块,因此它将比逐个分配元素引入更少的内存开销(请参见底部的注释)
无论如何,好的C++程序员应该避免手工管理内存。对于数组,使用标准库类(
vector
、map
、list
等)。尽可能使用RAII,不要使用原始指针,而是使用“智能”指针
注意:我在这里写的所有内容都完全依赖于所使用的算法,所以关于数组分配的段落可能不适用于所有可能的内存分配算法。因此,直接回答“块分配与单个对象分配之间的主要区别是什么”也取决于算法。另一个非常重要的区别是异常安全。在代码中:
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
如果在分配第一个和最后一个foo
之间引发异常,这将至少销毁每个构造的foo
当然,您必须注意将正确删除f
,尤其是如果代码中存在其他执行此操作的抛出点
寓意:使用标准容器。乍一看,手动内存管理似乎微不足道,特别是如果您来自C语言,但编写异常安全代码并非微不足道,而且至关重要 我听说我们分配的每个对象都有16个管理字节。因此,块分配将仅使用一个标头保护。是真的吗?我没听过那个谣言。另一方面,
new[]
可能必须将iCount
存储在某个地方,以便delete[]
可以找到它。也许这会占用更多的内存,而不是更少?[链接]
//////////////////
foo* f = new foo[iCount];