VB2015 - Array und String - dynamische Länge

Gast #4712297
Lesenswert?

Hi Leute!

Ich mache gerade meinen ersten Versuche mit VB und habe eine Frage: Im 
Internet habe ich gelesen, dass es für Arrays den Befehl ReDim gibt, um 
die Größe des Arrays während der Laufzeit zu vergößern. Um den Inhalt zu 
erhalten gibt es zusätzlich Preserve.

Dann gibt es noch die Variable deklariert als String. Hier finde ich 
nirgends etwas über die Notwendigkeit, die Größe der Variable (ist ja 
auch ein Array von Zeichen) zu erhöhen. Hier kann ich beliebig lange 
Zeichenketten zuweisen.

Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert? 
Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger 
auf das nächste besitzen.

Weiß jemand Bescheid? Ich finde im Netz keine zufriedenstellende 
Antwort.

Danke!
Gast #4712381
Lesenswert?

Gleich vorweg: Ich habe mit VB nichts am Hut.

> Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert?

Ein Array ist in diesem Fall ein einfacher Speicherblock, in dem 
nacheinander (indizierbar) Werte stehen.
ReDim allokiert einen neuen Block und kopiert bei Bedarf Daten aus dem 
alten (Preserve). Das Ganze dient im Prinzip nur der 
Rückwärtskompabilität; in VB.NET sollte man eher die generischen 
Collections verwenden, z.B. List(Of T).

Auch bei einem String wird - wenn der zur Verfügung stehende 
Speicherbereich komplett mit Zeichen belegt ist - ein neuer Block 
allokiert, Daten werden kopiert und der alte Block wird verworfen. Nur 
geschieht dies intern in der String-Klasse, so dass man sich darum nicht 
kümmern muss (ähnlich wie bei 'List'). Es gibt natürlich eine Reserve - 
mehr oder weniger "intelligent" bestimmt; meist wird die Größe des 
Speicherbereichs verdoppelt -, damit nicht bei jedem Hinzufügen eines 
Zeichens Speicher allokiert werden muss.

> Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger
> auf das nächste besitzen.

Nicht bei String oder List, aber es gibt die Klasse LinkedList 
(LinkedList(Of T)), bei dies so funktioniert. Der Einsatz ist aber nur 
in speziellen Fällen sinnvoll. Einerseits, weil einige Operationen 
deutlich weniger effizient sind, da man sich ja "durchhangeln" muss, 
andererseits weil die Daten im Speicher verstreut liegen und der 
CPU-Cache das nicht mag (wobei das natürlich bei Referenztypen auch bei 
anderen Datenstrukturen der Fall ist).

https://msdn.microsoft.com/de-de/library/wak0wfyt.aspx
https://msdn.microsoft.com/de-de/library/w8k3cys2.aspx
https://msdn.microsoft.com/de-de/library/he2s3bh7
http://csharpindepth.com/Articles/General/Strings.aspx

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren