alignof
alignof
C 코드와 얽힌 작업을 하다 보면 '이 타입은 메모리에서 몇 바이트 단위로 정렬될까' 궁금해질 때가 있어요. 그리고 그 값을 언어 차원에서 바로 얻을 수 있는 표현식이 alignof예요. alignof는 주어진 타입의 ABI 정렬(alignment)을 바이트 단위로 담은 Int32를 돌려줍니다. 예를 들어볼게요.
alignof(Int32) # => 4
alignof(Int64) # => 8
struct Foo
def initialize(@x : Int8, @y : Int16)
end
end
@[Extern]
@[Packed]
struct Bar
def initialize(@x : Int8, @y : Int16)
end
end
alignof(Foo) # => 2
alignof(Bar) # => 1
본문
Reference 타입의 정렬은 포인터의 정렬과 같아요.
# On a 64-bit machine
alignof(Pointer(Int32)) # => 8
alignof(String) # => 8
이유는 Reference의 메모리가 힙에 할당되고, 그 포인터가 여기저기로 전달되기 때문이에요. 클래스의 실제 정렬이 필요하다면 instance_alignof를 쓰세요.
alignof의 인자는 타입이고, typeof와 함께 쓰는 일이 많아요.
a = 1
alignof(typeof(a)) # => 4
alignof는 매크로 언어에서도 쓸 수 있는데, 크기와 정렬이 안정적인 타입에서만 가능해요. 자세한 내용은 alignof API 문서를 참고하세요.
더 알아보기 (Learn more)
- Crystal 공식 문서 - alignof
- instance_alignof — 클래스의 실제 정렬을 얻는 표현식
- type_grammar — 타입 문법