Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;对象块分配与单个分配_C++_Memory - Fatal编程技术网

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];