fixed
Midoliy|F#プログラミング

fixedキーワードの概要

fixedキーワードの概要


 fixedキーワードは、ガベージコレクションに収集されたり、移動させられたりするのを防ぐために利用します。主に低レベルのプログラミングをする際に利用することが多いです。
余談ですが、「低レベルプログラミング」という言葉は「レベルが低い」という意味ではなく、「Low Layer」という意味なので間違わないようにしましょう。うっかり本屋さんで「低レベルプログラミング」という、その名もズバリな書籍を勘違いして購入してしまうと、あまりのハイレベルさに卒倒してしまうかもしれません。

 話を戻しまして、以下にfixedキーワードの構文を示します。
// -------------------------------------
// [ 構文 ]
use ptr = fixed expression

 fixedキーワードを利用することによって、対象リソースはメモリ上に固定されます。また、「use」キーワードからわかるとおり、リソース管理のときと同様、スコープを抜けると固定されているリソースは固定解除されます。
 また、fixedキーワードは関数かメソッドの中でしか利用することができないことにも注意が必要です。スクリプトでの利用やモジュールレベルでのスコープでは使用することができませんので、覚えておきましょう。
 fixedキーワードはポインタを扱うコードのため、いわゆる「危険な機能」の一つです。利用時には警告を発せられますので、利用時には用法用量をよく守りましょう。

 以下は、fixedキーワードを利用した簡単なサンプルとなります。
open Microsoft.FSharp.NativeInterop

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

let squareWithPointer p =
// nativeptr<'T>を扱うには, NativePtrモジュールを利用すると便利です.
    let mutable value = NativePtr.get p 0
    value <- value * value
    NativePtr.set p 0  value

let doPointWork p0 =
    // fixedキーワードを利用して, p0.Yのアドレスを固定します.
    // そうすることで, nativeptr<'T>を取得することが可能です(今回は nativeptr).
    use p = fixed &p0.Y
    squareWithPointer p

let pnt = { X=1; Y=2;}
printfn "X= %d, Y= %d" pnt.X pnt.Y

doPointWork pnt
printfn "X= %d, Y= %d" pnt.X pnt.Y
// 
// output:
//      X= 1, Y= 2
//      X= 1, Y= 4
//

 fixedキーワードは通常、値を固定しなければならない機会がそう多くないために、あまり利用されることがありません(もちろん分野によっては頻繁に利用するので一概には言えませんが...)。私自身、画像処理のコーディングの際に利用するくらいなものです。
 しかし、知らないとハマることもありますので、記憶の片隅にでも置いておくと良いでしょう。