fixed 키워드

fixed 키워드

fixed 키워드는 지역 변수를 스택에 "고정(pin)"해서 가비지 컬렉션 과정에서 수집되거나 이동되지 않도록 막아 주는 기능이에요. 주로 저수준 프로그래밍(low-level programming) 시나리오에서 사용됩니다.

출처: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/fixed

본문

구문 (Syntax)

use ptr = fixed expression

설명 (Remarks)

이 구문은 식(expression)의 문법을 확장해서, 가비지 컬렉션 중에 수집되거나 이동되지 않도록 보장된 포인터를 추출해 이름에 묶을 수 있게 해 줍니다.

식에서 얻은 포인터는 fixed 키워드로 고정되고, use 키워드를 통해 식별자(identifier)에 바인딩됩니다. 이 동작은 use 키워드를 통한 리소스 관리와 의미가 비슷해요. 포인터는 스코프 안에 있는 동안 고정되며, 스코프를 벗어나면 더 이상 고정되지 않습니다.

fixeduse 바인딩의 문맥 밖에서는 사용할 수 없어요. 반드시 포인터를 use로 어떤 이름에 바인딩해야 합니다.

fixed의 사용은 함수나 메서드 안의 식에서만 가능합니다. 스크립트 수준이나 모듈 수준의 스코프에서는 사용할 수 없어요.

모든 포인터 코드와 마찬가지로 이 기능은 안전하지 않은(unsafe) 기능이며, 사용하면 경고가 발생합니다.

예제 (Example)

open Microsoft.FSharp.NativeInterop

type Point = { mutable X: int; mutable Y: int}

let squareWithPointer (p: nativeptr<int>) =
    // 0번째 주소의 포인터가 가리키는 값을 역참조합니다.
    let mutable value = NativePtr.get p 0

    // 어떤 작업을 수행합니다
    value <- value * value

    // 0번째 주소의 포인터가 가리키는 위치에 값을 설정합니다.
    NativePtr.set p 0 value

let pnt = { X = 1; Y = 2 }
printfn $"pnt before - X: %d{pnt.X} Y: %d{pnt.Y}" // 1과 2를 출력합니다

// 'fixed'의 사용은 함수 안에서만 가능하다는 점에 주의하세요.
// 스크립트 수준이나 모듈 수준의 스코프에서는 포인터를 고정할 수 없습니다.
let doPointerWork() =
    use ptr = fixed &pnt.Y

    // Y 값을 제곱합니다
    squareWithPointer ptr
    printfn $"pnt after - X: %d{pnt.X} Y: %d{pnt.Y}" // 1과 4를 출력합니다

doPointerWork()

더 알아보기 (Learn more)