offsetof

offsetof

offsetof 표현식은 클래스나 구조체의 인스턴스에서 어떤 필드의 바이트 오프셋을 돌려줘요. C API가 Crystal 타입의 데이터 레이아웃에 직접 인터페이스해야 할 때 필요한 저수준 원시(primitive) 기능이에요.

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

출처: Crystal 공식 문서 - offsetof

더 알아보기 (Learn more)