繁体   English   中英

我可以像 `delete[]` 那样获取动态分配数组的大小吗?

[英]Can I get the size of a dynamicly allocated array the way `delete[]` does?

我想知道delete[]是如何知道动态分配数组的大小的,我发现了这个问题(以及 Microsoft 论坛上的这个问题,但答案是相似的)。 原来答案

这通常存储在您分配的内存之前的“头”段中。

因此,确切的细节是特定于实现的。
在该回答下,其中一条评论询问为什么程序员无法获得这条非常有用的信息,这迫使我们传递表示大小的变量。 评论得到的答案是

强制分配器存储请求的大小(这样您就不需要自己传递数组大小)可能是一个小麻烦,但它可能会对可想象的分配器设计产生性能影响

对我来说,考虑到delete[]无论如何都应该可以访问大小,这并不是很有说服力。

我的问题:是否有可能(对于程序员)以某种方式检索大小?

我知道微软有一种特殊的方式(正如前面提到的 MS 论坛中所指出的那样),但我追求的是标准化。

您可以使用 Microsoft 特定函数 _msize() 从指针获取动态分配数组的大小,即使它被传递给另一个函数而不是进行分配的函数。

如果您使用开源库,那么是的,您可以,只需查找源代码即可。 弄清楚如何去做。

但这仍然是一个坏主意,因为没有任何保证:实现可能随时更改,并且不能保证即使在 Unix 和 Linux 之间也是可移植的。 这个数字也可能太大,因为分配更多可能是有利的,例如对齐。 这也是不必要的:当你new一个空间时,你就知道它的大小。 你可以传递它,或者将它存储在你控制的某个地方。 这并不比通过 malloc 的实现查找它更糟糕。

我的结论是:
数组的大小可能存储在内存中,但不一定如此; 还有其他方法可以实现所需的行为,每种方法都有自己的权衡取舍,ISO 专门为编译器编写者提供了选择的自由,以便他们可以根据需要对其进行优化。
也就是说,目前还没有一种单一的、标准化的方法来获取动态分配数组的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM