使用new int [10]时元数据需要多少内存?

时间:2010-06-22 04:29:00

标签: c++

当使用'new'创建数组并使用'delete'运算符删除数组时,delete知道数组的大小。如其他SO线程中所述,此大小信息存储在元数据中。

我的问题:元数据中究竟存储了什么以及需要多少空间?它只是存储在元数据中的大小吗?

4 个答案:

答案 0 :(得分:8)

根据C ++标准5.3.4 / 12:

new T[5] results in a call of operator new[](sizeof(T)*5+x), 
     

< ...>其中x是表示数组分配开销的非负未指定值。 < ...>数量   开销可能因新的一次调用而异。

答案 1 :(得分:4)

它是实现定义的。我想说长度至少有四个字节,但也可能有相邻块的“下一个”和“前一个”指针。还可能有一个“魔术”数字,运行时使用它来确保你没有意外地覆盖它们的内存部分等等。

但你不应该担心这一点。实际上,对于像int[10]这样的小数组(40字节),您可能会发现填充实际占用的空间最大(例如,可能会添加24个字节的填充以使分配32的倍数 - 这可以出于性能原因,比如说。

尽管如此,正如我所说,完全由实施决定他们如何做到这一点。

答案 2 :(得分:0)

这类问题非常适合编译和plataform。每个编译器都以不同的方式实现它。标准说应该实现什么,而不是如何实现它。

当然,此元数据必须包含数组大小或允许我们推断它的其他一些信息。否则,我们将无法为数组中的所有对象调用析构函数。

答案 3 :(得分:0)

这将取决于您的标准库。甚至malloc()也需要数据才能知道分配了多少字节。举个例子,看一下glibc malloc:

http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=malloc/malloc.c;hb=HEAD

  

每个已分配块的最小开销:4或8个字节

  Each malloced chunk has a hidden word of overhead holding size
  and status information.