Nach dem, was ich verstehe, sind Strings in Nim grundsätzlich eine veränderbare Bytefolge und werden bei der Zuweisung kopiert.
Da ich angenommen habe, dass sizeof
mir (wie len
) die Anzahl der Bytes sagen würde, aber stattdessen immer 8
auf meiner 64-Bit-Maschine gibt, so scheint es einen Zeiger zu halten.
Da habe ich folgende Fragen ...
Was war die Motivation hinter dem Kopierauftrag? Ist es weil sie veränderbar sind?
Gibt es jemals eine Zeit, in der es nicht kopiert wird, wenn es zugewiesen wird? (Ich nehme an, dass nicht var
Funktionsparameter nicht kopiert werden. Sonst noch etwas?)
Sind sie so optimiert, dass sie nur dann kopiert werden, wenn sie mutiert sind?
Gibt es einen signifikanten Unterschied zwischen einer Zeichenfolge und einer Sequenz oder können die Antworten auf die obigen Fragen gleichermaßen auf alle Sequenzen angewendet werden?
Gibt es sonst noch etwas Wertvolles?
Danke!
Die Definition von Strings ist tatsächlich in system.nim
, nur unter einem anderen Namen:
Eine Zeichenfolge ist also ein roher Zeiger auf ein Objekt mit einem len
, reserved
und data
-Feld. Die Procs für Strings sind in systr.nim definiert.
Die Semantik der String-Zuweisungen wurde standardmäßig so gewählt, dass sie für alle Werttypen (nicht ref oder ptr) in Nim gilt. Sie können also davon ausgehen, dass Zuweisungen eine Kopie erstellen. Wenn eine Kopie unnötig ist, kann der Compiler es weglassen, aber ich bin mir nicht sicher, wie viel das bisher passiert. Das Übergeben von Zeichenfolgen an einen Proc kopiert sie nicht. Es gibt keine Optimierung, die Zeichenkettenkopien verhindert, bis sie mutiert sind. Sequenzen verhalten sich auf die gleiche Weise.
Sie können das Standardzuweisungsverhalten von Strings und Seqs ändern, indem Sie sie als seicht markieren, und dann wird keine Zuweisung ausgeführt:
%Vor%