Rust의 derive, 의도하지 않은 inline까지 발생
원제 Rust's derive often implies inline
114 포인트댓글 30
Key Point
derive 매크로가 자동으로 추가하는 inline이 복잡한 타입에서는 바이너리 크기를 크게 증가시킬 수 있어, 최적화 가정을 다시 생각해야 할 필요가 있다.
핵심 요약
- Rust에서 Debug, Clone 같은 트레이트를 #[derive(...)]로 구현하면 컴파일러가 자동으로 #[inline] 힌트를 추가한다.
- 이는 명시적으로 보장되지 않지만 공식 레퍼런스에서 예시로 나타나고 매크로 전개로도 확인할 수 있다.
- 대부분의 경우 inline이 유리한데, 파생된 Debug나 Clone 구현은 일반적으로 간단해서 인라인 최적화의 이점을 본다.
- 하지만 복잡한 에러 계층구조처럼 코드가 많은 경우 각 호출마다 전체 구현이 인라인되어 문제가 된다.
- uv 프로젝트에서는 Debug 구현이 반복적으로 인라인되면서 바이너리 크기가 160KB 증가했다.
- rustc가 인라인 횟수나 크기에 제한을 두지 않아 의외로 큰 바이너리 팽창이 발생했다.
- 이를 해결하기 위해 #[inline(never)]을 추가한 커스텀 proc 매크로를 작성해 제어했다.