[Rust] FFI: 데이터 레이아웃과 alignment
C나 C++ 환경에서 개발을 좀 깊게 해봤다면, alignment 관련 문제를 겪어본 적이 있을 것이다.
예를 들어, 아래와 같이 구조체를 구성한다면
그냥 본다면 1+4+2 바이트 해서 총 7바이트가 할당되겠거니, 생각할 수도 있지만,
컴파일러는 저걸 그대로 순진하게 쓰지는 않는다.
왜냐면, 오늘날 사용되는 프로세서들은 일반적으로 처리하기에 최적화된 데이터 크기가 정해져있기 때문이다.
대부분의 타겟에서는 그 최적의 사이즈인 word가 4바이트이기 때문에, 아래와 같은 형태로 패딩을 넣어서 더 빠르게 실행될 수 있게 한다.
이건 하나의 예시일 뿐이고, 컴파일러가 alignment를 어떻게 지정할지는 정확하게 할 수는 없다. 상황에 따라 알아서 잘 하는 부분이기 때문이다.
대부분의 사용사례에서는 이게 문제가 되지 않는다.
메모리 몇바이트 더 먹는다고 문제가 생기는 것도 아니기 때문이다.
C와의 상호 호환성
현실적으로 Rust에서 모든것을 다 할수는 없기 때문에, 러스트도 FFI를 활용해 C 코드와 연결할 때가 잦다.
그러면 C의 구조체를 통해 데이터를 주고받을 수 있는데, Rust와 C의 alignment 정책이 같지는 않기 때문에 호환성에 문제가 생길 수 있다.
그럴 때는 repr(C) 매크로를 사용해서 C 스타일대로 align이 되도록 유도해줘야 한다.

alignment 사이즈 지정
특수한 상황에서의 최적화가 필요하거나, 여타 특이한 흑마술을 사용할 경우에는 alignment 사이즈를 임의로 지정하게 할 수도 있다.
예를 들어, 아래와 같이 packed 값을 넣으면 alignment 사이즈가 8로 고정된다.
그럼 아마 저 3개의 필드가 하나의 pack에 들어가고, 1바이트의 패딩이 들어갈 것이다.
참조
https://doc.rust-lang.org/nomicon/repr-rust.html
https://doc.rust-lang.org/reference/type-layout.html