Nim: Parameteradressen und Veränderbarkeit

Ich versuche, meine Meinung über Nims Politik hinter @ zu bildexpression has no address. Insbesondere habe ich eine C-Funktion, die einen Zeiger (+ Länge usw.) eines Datenpuffers nimmt. Ich weiß, dass diese Funktionnich Ändern Sie die Daten. Vereinfacht:

type
  Buffer = object
    data: seq[float]

proc wrapperForCCall(buf: Buffer) =
  # accessing either buf.addr nor buf.data.addr produces
  # Error: expression has no address
  # workaround:
  var tmp = buf.data          # costly copy
  callToC(tmp.len, tmp.addr)  # now it works

ies ist zum einen sinnvoll, da sich ein Parameter genau wie ein @ zu verhalten scheinletbindung, die auch "keine adresse hat". Andererseits wundert mich diese Aussage im Handbuch:

var-Parameter sind niemals für eine effiziente Parameterübergabe erforderlich.

Soweit ich sehen kann, können Sie das Kopieren der Daten nur vermeiden, indem Sie folgende Schritte ausführen:

Übergabe des Parameters alsbuf: var BufferÜbergeben einer Referenz, d. h. Verwenden einesref object.

In beiden Fällen deutet dies darauf hin, dass meine Funktion die Daten ändert. Darüber hinaus wird die Veränderbarkeit der Anrufer-Site eingeführt (d. H. Benutzer können keine Let-Bindings mehr für ihre Puffer verwenden). Die Schlüsselfrage für mich ist: Da "ich weiß", dasscallToC ist schreibgeschützt, kann ich Nim davon überzeugen, beide Unveränderlichkeiten ohne Kopie zuzulassen? Ich sehe, dass dies gefährlich ist, da ich sicher sein muss, dass der Anruf unveränderlich ist. Dies würde also eine Art Mechanismus für "unsichere Adressen" erfordern, der es ermöglicht, Zeiger auf unveränderliche Daten zu erzwinge

Und mein letztes Geheimnis der Parameteradressen: Ich habe versucht, die Notwendigkeit der Kopie zu verdeutlichen, indem ich den Typ in @ ändertBuffer {.bycopy.} = object. In diesem Fall geschieht die Kopie bereits zum Zeitpunkt des Anrufs, und ich würde erwarten, jetzt Zugriff auf die Adresse zu haben. Warum wird der Zugriff auch in diesem Fall verweigert?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage