c++ 为什么运行时环境不能决定应用删除或删除[]而不是程序员?

我已经读过delete []运算符是需要的,因为运行时环境不能保存关于分配的块是否是需要析构函数调用的对象数组的信息,但实际上它确实保留了内存中的哪个位置是被分配的信息块存储,当然还有块的大小。
如果析构函数需要被删除或删除,那么这个元数据只需要一点点,那么为什么不这么做呢?

我很确定有一个很好的解释,我不是在质疑,我只想知道。

最佳答案
在这里需要清理两件事情。

First: the assumption that malloc keeps the precise size you asked.

不是真的。 malloc只关心提供足够大的块。尽管出于效率的原因,它不会太多地分配,但它仍然可能会给你一个“标准”大小的块,例如2 ^ n个字节块。因此,实际大小(如在实际分配的对象的数量)是有效的未知数。

Second: the “extra bit” required

实际上,给定对象所需的信息是否是数组的一部分将仅仅是额外的一点。按道理。

就执行而言,实际上是哪里呢?

分配给对象本身的内存不应该被触摸,所以对象正在使用它。那么

>在一些平台上,这可以保留在指针本身(一些平台忽略一部分位),但这不是便携式的
>所以它需要额外的存储,至少是一个字节,除了对齐问题,它可能会达到8个字节。

示范:(不能说服sth,如下所示)

// A plain array of doubles:
+-------+-------+-------
|   0   |   1   |   2   
+-------+-------+-------

// A tentative to stash our extra bit
+-------++-------++-------++
|   0   ||   1   ||   2   ||
+-------++-------++-------++

// A correction since we introduced alignment issues
// Note: double's aligment is most probably its own size
+-------+-------+-------+-------+-------+-------
|   0   |  bit  |   1   |  bit  |   2   |  bit
+-------+-------+-------+-------+-------+-------

Humpf!

编辑

因此,在大多数平台上(地址重要),您将需要“扩展”每个指针,并将其大小(对齐问题)实际上加倍。

所有指针的大小只有两倍,所以你可以把这个额外的一点放在一边吗?对于大多数人来说,我猜这将是。但是,C并不是为大多数人设计的,它主要是为那些关心性能,无论速度还是记忆而设计的,因此这是不可接受的。

编辑结束

那么正确的答案是什么?正确的答案是恢复类型系统丢失的信息是昂贵的。不幸。

转载注明原文:c++ 为什么运行时环境不能决定应用删除或删除[]而不是程序员? - 代码日志