gpt4 book ai didi

c# - 为什么数组不能被修剪?

转载 作者:IT王子 更新时间:2023-10-29 03:41:52 26 4
gpt4 key购买 nike

在 MSDN 文档站点上,它对 Array.Resize 方法说了以下内容:

If newSize is greater than the Length of the old array, a new array isallocated and all the elements are copied from the old array to thenew one.

If newSize is less than the Length of the old array, a new array isallocated and elements are copied from the old array to the new oneuntil the new one is filled; the rest of the elements in the old arrayare ignored.

数组是一系列相邻的内存块。如果我们需要一个更大的数组,我知道我们不能向它添加内存,因为它旁边的内存可能已经被其他一些数据占用。因此,我们必须声明一个新的具有所需更大大小的相邻内存块序列,将我们的条目复制到那里并删除我们对旧空间的声明。

但是为什么要创建一个尺寸更小的新数组呢?为什么数组不只是删除它对最后一个内存块的声明?那么它将是一个 O(1) 操作而不是 O(n),就像现在一样。

它与数据在计算机架构或物理层面上的组织方式有关吗?

最佳答案

未使用的内存实际上并不是未使用。跟踪堆中的漏洞是任何堆实现的工作。至少,经理需要知道洞的大小,并需要跟踪他们的位置。这总是至少花费 8 个字节。

在 .NET 中,System.Object 起着关键作用。每个人都知道它的作用,但不是很明显以至于它在收集对象后继续存在。对象头中的两个额外字段(同步块(synchronized block)和类型句柄)然后变成指向前一个/下一个空闲 block 的向后和向前指针。它还具有最小大小,在 32 位模式下为 12 字节。保证在收集对象后始终有足够的空间来存储空闲 block 大小。

所以您现在可能明白了问题,减小数组的大小并不能保证创建一个足够大的洞来容纳这三个字段。除了抛出“不能那样做”的异常之外,它什么也做不了。还取决于过程的位数。完全丑陋到无法考虑。

关于c# - 为什么数组不能被修剪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38453335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com