Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 使用新int[10]时,元数据需要多少内存?_C++ - Fatal编程技术网

C++ 使用新int[10]时,元数据需要多少内存?

C++ 使用新int[10]时,元数据需要多少内存?,c++,C++,当使用“new”创建数组并使用“delete”操作符删除时,delete知道数组的大小。如其他SO线程中所述,此大小信息存储在元数据中 我的问题是:元数据中到底存储了什么,需要多少空间?是否只有存储在元数据中的大小 这类问题非常特定于编译器和平台。每个编译器以不同的方式实现这一点。该标准说明了应该实施什么,而不是具体如何实施 当然,此元数据必须包含数组大小,或者允许我们推断它的一些其他信息。否则,我们将无法为数组中的所有对象调用析构函数。它是实现定义的。我想说,长度至少有四个字节,但也可能有指向

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


我的问题是:元数据中到底存储了什么,需要多少空间?是否只有存储在元数据中的大小

这类问题非常特定于编译器和平台。每个编译器以不同的方式实现这一点。该标准说明了应该实施什么,而不是具体如何实施


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

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

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


在最后一天,虽然我说完全取决于实现来决定他们是如何执行的。

< P>根据C++标准5.3.4/12:

其中x是表示数组分配开销的非负未指定值 开销的大小可能因不同的new调用而异


这将取决于您的标准库。即使是malloc()也需要数据来知道分配了多少字节。例如,请查看glibc malloc:

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

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

标准对此毫无说明,我想这取决于具体的实现。这是一个特定的malloc实现。我写了一个,指针值本身对信息进行了编码——这一点在今天更为琐碎,有64位指针。@MSalters:我很好奇如何以及为什么。我不知道怎么做使用通用malloc实现这一点(对于不同的对象大小,没有不同的内存池)您得到了解决方案:针对不同对象大小的不同内存池。您通常可以从操作系统中以小到4 KB的块分配内存,并且所需的内存池数量相当有限。如果将分配四舍五入到2的幂次方,则最多只有12个不同的内存池大小(超过4KB的内存将由操作系统直接分配)。浪费量最多为12*4KB,通常为12*2KB。这意味着当您有数千个小型分配时,它会变得高效,这一点并不罕见。
  Each malloced chunk has a hidden word of overhead holding size
  and status information.