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 scheinlet
bindung, 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?