Palabra clave “fixed”
La palabra clave fixed
permite "anclar" un elemento local a la pila para evitar que se recopile o se mueva durante la recolección de elementos no utilizados. Se usa para escenarios de programación de bajo nivel.
Sintaxis
use ptr = fixed expression
Comentarios
Esto extiende la sintaxis de expresiones para permitir que se extraiga un puntero y enlazarlo a un nombre, cuya recolección o traslado se impiden durante la recolección de elementos no utilizados.
Un puntero de una expresión se fija con la palabra clave fixed
y se enlaza a un identificador con la palabra clave use
. La semántica que se utiliza para esto es similar a la administración de recursos con la palabra clave use
. El puntero se fija mientras está en el ámbito y, una vez está fuera del ámbito, ya no está fijo. fixed
no se puede usar fuera del contexto de un enlace use
. Debe enlazar el puntero a un nombre con use
.
El uso de fixed
debe producirse dentro de una expresión en una función o en un método. No se puede usar en un ámbito de nivel de script o de módulo.
Como todo el código de puntero, se trata de una característica no segura y emitirá una advertencia cuando se use.
Ejemplo
open Microsoft.FSharp.NativeInterop
type Point = { mutable X: int; mutable Y: int}
let squareWithPointer (p: nativeptr<int>) =
// Dereference the pointer at the 0th address.
let mutable value = NativePtr.get p 0
// Perform some work
value <- value * value
// Set the value in the pointer at the 0th address.
NativePtr.set p 0 value
let pnt = { X = 1; Y = 2 }
printfn $"pnt before - X: %d{pnt.X} Y: %d{pnt.Y}" // prints 1 and 2
// Note that the use of 'fixed' is inside a function.
// You cannot fix a pointer at a script-level or module-level scope.
let doPointerWork() =
use ptr = fixed &pnt.Y
// Square the Y value
squareWithPointer ptr
printfn $"pnt after - X: %d{pnt.X} Y: %d{pnt.Y}" // prints 1 and 4
doPointerWork()