Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hat Setlength eine interne vorgeschaltete Längenprüfung? (https://www.delphipraxis.net/190956-hat-setlength-eine-interne-vorgeschaltete-laengenpruefung.html)

Delphi-Laie 23. Nov 2016 13:05

Delphi-Version: 5

Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
Hallo Delphifreunde!

Weder meine Recherche im Internet, in der Delphi-Dokumentation noch im Quelltext (der Unit system) konnte meine Frage klären:

Hat die Setlength-Prozedur (n.m.W. für Strings und dynamische Arrays, vielleicht neuerdings noch für anderes) eine interne vorgeschaltete Längenprüfung? Oder ist die Setlength-Prozedur ohnehin so intelligent (programmiert worden), daß die Längensetzung nur dann in irgendeiner Form Speicher verbraucht, wenn diese eine Längenänderung zur Folge hat?

Oder, etwas plakativer: Ist es sinnvoll, redundant oder sogar schädlich,

Delphi-Quellcode:
if length(Datenstruktur) <> Wunschlaenge then setlength(Datenstruktur, Wunschlaenge)


zu schreiben?

Vielen Dank im voraus und viele Grüße

Delphi-Laie

Neutral General 23. Nov 2016 13:24

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
Bin mir relativ sicher, dass SetLength nichts tut wenn die Länge des Arrays/Strings schon gleich der geforderten Länge ist.
Aber eine Garantie/Quelle habe ich nicht.

Uwe Raabe 23. Nov 2016 13:29

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
Zitat:

Zitat von Neutral General (Beitrag 1354489)
Bin mir relativ sicher, dass SetLength nichts tut wenn die Länge des Arrays/Strings schon gleich der geforderten Länge ist.
Aber eine Garantie/Quelle habe ich nicht.

Es tut schon so Einiges, insbesondere in Bezug auf Referenzzählung und Thread-Sicherheit - selbst wenn am Ende dann doch alles beim Alten bleibt.

jaenicke 23. Nov 2016 13:43

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
Es gibt keine Prüfung in DynArraySetLength, ob die Länge bereits stimmt. Wie Uwe schon schrieb passiert da einiges und es werden lediglich die Fälle behandelt, dass die neue Größe größer bzw. kleiner ist. Deshalb macht eine Prüfung vorher durchaus Sinn, wenn der Fall häufiger vorkommt.

Delphi-Laie 23. Nov 2016 13:52

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
3 Experten, 4 Meinungen...Spaß beiseite, vielen Dank!

himitsu 23. Nov 2016 14:25

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
SetLength sorgt als Erstes immer erstmal für eine Unique-Instanz, selbst wenn nichts gemacht wird.

Und es gibt einen Unterschied welches "SetLength" aufgerufen wird.
SetLength für ShortString -> String[x]
SetLength für WideString -> OLE32
SetLength für LongStrings -> AnsiString, UnicodeString, UTF8String, ... (wobei das "dyn. Arrays" mit kompltt funktionsfähigem CopyOnWrite und paar weiteren Addons sind)
SetLength für dynamische Arrays (mit oder ohne gemanageten Typen im Array)

siehe System.pas (abgesehn von dem Problemchen mit den fehlenden Quellcodes in der Starter)
_SetLength(s: PShortString; ...)
_WStrSetLength
_LStrSetLength, _UStrSetLength
_DynArraySetLength

hoika 23. Nov 2016 19:08

AW: Hat Setlength eine interne vorgeschaltete Längenprüfung?
 
Hallo,
also laut meinem Quellcode der System.pas wird bei einem
Array-SetLength nicht erkannt, wenn die Länge gleich bleibt.

Komisch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz