Was sind die Auswirkungen der eine flache Kopie auf einem Array, um es, um die Größe der Durchführung?

StackOverflow https://stackoverflow.com/questions/432672

  •  10-07-2019
  •  | 
  •  

Frage

Wenn mein Verständnis von tiefen und flachen Kopieren korrekt ist meine Frage ist ein unmöglicher. Wenn Sie einen Array haben (a [10]) und führen eine flache Kopie (b [20]) wäre dies nicht unmöglich sein, da die Daten in b nicht zusammenhängend sein würden?

Wenn ich habe diese völlig falsch bekam jemand einen schnellen Weg raten könnte zu imitieren (in c #) c ++ 's Fähigkeit, eine realloc zu tun, um ein Array zu ändern.

Hinweis
Im Blick auf die .Clone () und .Copy () Mitglieder des System.Array Objekt.

War es hilfreich?

Lösung

Sie können eine bestehende Array nicht die Größe, jedoch können Sie verwenden:

Array.Resize(ref arr, newSize);

Diese ordnet ein neues Array, kopiert die Daten aus dem alten Array in das neue Array und aktualisiert die arr Variable (die durch-ref in diesem Fall übergeben wird). Ist das, was Sie?

kann jedoch jedes andere Referenzen immer noch auf dem alten Array zeigt, werden nicht aktualisiert. Eine bessere Option könnte sein, mit List<T> zu arbeiten - dann müssen Sie es nicht manuell, um die Größe, und Sie haben nicht das Problem der out-of-date Referenzen. Sie Add nur / Remove usw. Im Allgemeinen Sie keine Arrays sind in der Regel direkt oft sehr zu verwenden. Sie haben ihren Nutzen, aber sie sind nicht der Standardfall.


Re Ihre Kommentare;

  • Boxen: List<T> nicht boxen. Das ist einer der Punkte, über Generika; unter der Haube, ist List<T> ein Wrapper um T[], so ein List<int> hat eine int[] - keine Boxen. Der ältere ArrayList ist ein Wrapper um object[], so dass hat Box; natürlich, Boxen ist nicht so schlecht, wie Sie trotzdem könnte man annehmen, .
  • Funktionsweise von Array.Resize; , wenn ich mich erinnere, findet es die Größe von T, dann Buffer.BlockCopy verwendet den Inhalt blitten die tatsächlichen Angaben werden von einem internen Anruf versteckt - aber im Wesentlichen nach dem ein neuen Array Zuweisung ist es ein blit (memcpy) von die Daten zwischen den beiden Feldern, so sollte es ziemlich schnell sein; beachten Sie, dass für Referenz-Typen dies nur kopiert die Referenz, nicht das Objekt auf dem Heap. Wenn Sie jedoch sind die Größenänderung regelmäßig, würde List<T> in der Regel viel einfacher (und schneller, wenn Sie im Grunde neu zu implementieren, was List<T> freie Kapazitäten hat erneut die Anzahl der Größenänderungen zu minimieren).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top