コンテンツへスキップ

offsetof

offsetof 式は、クラスまたは構造体のインスタンス内のフィールドのバイトオフセットを返します。

offsetof 式には2つの形式があります。最初の形式は、最初の引数として任意の型を受け入れ、2番目の引数として @ で始まるインスタンス変数名を受け入れ、指定された型のインスタンスに対するそのインスタンス変数の相対的なバイトオフセットを返します。

struct Foo
  @x = 0_i64
  @y = 34_i8
  @z = 42_u16
end

offsetof(Foo, @x) # => 0
offsetof(Foo, @y) # => 8
offsetof(Foo, @z) # => 10

2番目の形式は、最初の引数として任意の Tuple インスタンス型を受け入れ、2番目の引数として整数リテラルインデックスを受け入れ、指定された型のインスタンスに対する対応するタプル要素のバイトオフセットを返します。

offsetof(Tuple(Int64, Int8, UInt16), 0) # => 0
offsetof(Tuple(Int64, Int8, UInt16), 1) # => 8
offsetof(Tuple(Int64, Int8, UInt16), 2) # => 10

これは低レベルのプリミティブであり、Crystal 型のデータレイアウトと直接インターフェイスする必要がある C API の場合にのみ役立ちます。