跳至內容

offsetof

一個 offsetof 表達式會回傳類別或結構的實例中,某個欄位的位元組偏移量。

offsetof 表達式有兩種形式。第一種形式接受任意型別作為第一個引數,以及一個以 @ 為前綴的實例變數名稱作為第二個引數,並回傳該實例變數相對於給定型別實例的位元組偏移量。

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

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

第二種形式接受任何 Tuple 實例型別作為第一個引數,以及一個整數字面值索引作為第二個引數,並回傳對應的元組元素相對於給定型別實例的位元組偏移量。

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

這是一個底層基本類型,只有在 C API 需要直接與 Crystal 型別的資料佈局介接時才有用。