2 Stimmen

Welche Auswirkungen hat die Durchführung einer flachen Kopie auf ein Array, um dessen Größe zu ändern?

Wenn mein Verständnis von tiefem und oberflächlichem Kopieren richtig ist, ist meine Frage unmöglich. Wenn Sie ein Array (a[10]) haben und eine flache Kopie (b[20]) durchführen, wäre dies nicht unmöglich, da die Daten in b nicht zusammenhängend sind?

Wenn ich diese völlig falsch könnte jemand einen schnellen Weg zu imitieren (in c#) C++ Fähigkeit, eine Realloc zu tun, um ein Array Größe zu ändern beraten.

ANMERKUNG
Ich schaue mir die Elemente .Clone() und .Copy() des Objekts System.Array an.

0 Stimmen

4voto

Marc Gravell Punkte 970173

Sie können die Größe eines vorhandenen Arrays nicht ändern, aber Sie können es verwenden:

Array.Resize(ref arr, newSize);

Dies weist ein neues Array zu, kopiert die Daten aus dem alten Array in das neue Array und aktualisiert die arr Variable (die in diesem Fall per Referenz übergeben wird). Ist es das, was Sie meinen?

Allerdings ist jede andere Referenzen, die noch auf das alte Array verweisen, werden nicht aktualisiert. Eine bessere Option könnte die Arbeit mit List<T> - dann müssen Sie die Größe nicht manuell ändern, und Sie haben nicht das Problem veralteter Referenzen. Sie müssen nur Add / Remove usw. Im Allgemeinen werden Sie Arrays nicht sehr oft direkt verwenden. Sie haben ihren Nutzen, aber sie sind nicht der Standardfall.


Zu Ihren Kommentaren;

  • Boxen: List<T> boxt nicht. Das ist einer der Punkte über Generika; unter der Haube, List<T> ist ein Wrapper um T[] , also ein List<int> hat eine int[] - kein Boxen. Die Älteren ArrayList ist ein Wrapper um object[] , so dass hace Box; natürlich, Boxen ist nicht so schlimm, wie Sie vielleicht annehmen sowieso.
  • Funktionsweise von Array.Resize ; wenn ich mich recht erinnere, findet es die Größe von T und verwendet dann Buffer.BlockCopy um den Inhalt auszublenden die tatsächlichen Details sind durch einen internen Aufruf versteckt - aber im Wesentlichen nach der Zuweisung eines neuen Arrays ist es ein Blit (memcpy) der Daten zwischen den beiden Arrays, so sollte es ziemlich schnell sein; beachten Sie, dass für Referenz-Typen dies nur die Referenz kopiert, nicht das Objekt auf dem Heap. Wenn Sie jedoch regelmäßig die Größe ändern, List<T> wäre in der Regel viel einfacher (und schneller, es sei denn, Sie implementieren im Grunde neu, was List<T> die freie Kapazität, um die Anzahl der Größenänderungen zu minimieren).

0 Stimmen

Einige gültige Punkte, aber ich bin speziell auf Arrays suchen. Ich möchte nicht den Overhead von Objekten, die Box-Arrays wie Listen entstehen. Haben Sie irgendwelche Details über die innere Funktionsweise des Array.Resize Methode? dh ist es sehr schnell?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X