【问题标题】:What are the implications of performing a shallow copy on an array in order to resize it?对数组执行浅拷贝以调整其大小有什么影响?
【发布时间】:2010-09-30 18:23:55
【问题描述】:

如果我对深拷贝和浅拷贝的理解是正确的,那么我的问题是不可能的。 如果你有一个数组(a[10])并执行一个浅拷贝(b[20]),这不是不可能的,因为 b 中的数据不会是连续的吗?

如果我完全错了,有人可以建议一种快速的方法来模仿(在 c# 中)c++ 执行 realloc 以调整数组大小的能力。

注意
我正在查看 System.Array 对象的 .Clone() 和 .Copy() 成员。

【问题讨论】:

标签: c# deep-copy shallow-copy


【解决方案1】:

您无法调整现有数组的大小,但是,您可以使用:

Array.Resize(ref arr, newSize);

这会分配一个新数组,将旧数组中的数据复制到新数组中,并更新arr 变量(在这种情况下是通过-ref 传递的)。是这个意思吗?

但是,仍然指向旧数组的任何 other 引用都不会被更新。更好的选择可能是使用List<T> - 然后您不需要手动调整它的大小,并且您不会遇到过时引用的问题。你只是Add/Remove 等等。一般来说,你不会经常直接使用数组。它们有其用途,但它们不是默认情况。


是你的cmets;

  • 装箱:List<T> 不装箱。这是关于泛型的要点之一;在引擎盖下,List<T>T[] 的包装,所以List<int>int[] - 没有拳击。旧的ArrayListobject[] 的包装,所以 does 框;当然,无论如何,拳击isn't as bad as you might assume
  • Array.Resize 的工作; 如果我记得,它会找到T 的大小,然后使用Buffer.BlockCopy 对内容进行 blit (memcpy) 两个数组之间的数据,所以应该很快;请注意,对于引用类型,这仅复制引用,而不是堆上的对象。但是,如果您定期调整大小,List<T> 通常会更简单(而且速度更快,除非您基本上重新实现 List<T> 所提供的备用容量以最大限度地减少调整大小的次数)。

【讨论】:

  • 一些有效点,但我专门研究数组。我不希望盒子数组(如列表)的对象产生的开销。您对 Array.Resize 方法的内部工作有任何详细信息吗?即它非常快吗?
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2010-11-19
  • 2018-02-26
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多