跳至内容

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 类型的内存布局交互时才有用。