기타 Lobsters · 2일 전

Rust에서 #[derive] 썼다가 바이너리 용량 뻥튀기된 이유.txt

핵심 요약
  • Rust에서 #[derive] 매크로를 사용해 Debug 등을 구현하면 내부적으로 #[inline] 힌트가 자동 적용됩니다.
  • 중첩된 에러 구조체 등 복잡한 타입에서 포맷 코드가 반복 인라인되면서 실행 파일 크기가 급격히 커지는 문제가 발생합니다.
  • 파이썬 도구 uv 개발팀은 인라인을 방지하는 커스텀 매크로를 적용해 바이너리 크기를 약 160KB 줄였습니다.
요약 러스트(Rust) 언어에서 기본 트레이트(Debug, Clone 등)를 구현할 때 널리 쓰이는 `#[derive]` 매크로가 내부적으로 `#[inline]` 속성을 자동 부여하고 있으며, 이로 인해 바이너리 크기가 불필요하게 커질 수 있다는 분석이 공유됐습니다. 글쓴이가 매크로를 확장해 분석한 내용에 따르면, 러스트 컴파일러는 `#[derive(Debug)]`를 처리할 때 포맷팅 함수에 암묵적으로 `#[inline]` 힌트를 붙입니다. 가벼운 구조체에서는 인라인 처리가 성능 향상에 도움이 되지만, 여러 필드를 가진 구조체나 중첩된 에러 계층(Enum/Struct) 구조에서는 거대한 포맷팅 코드가 호출 지점마다 통째로 인라인되면서 코드 비대화(Code Bloat)를 유발합니다. 실제로 파이썬 패키지 관리 도구 'uv' 개발 과정에서 특정 `Debug` 구현체의 인라인 확장을 방지(커스텀 proc-macro를 만들어 `#[inline(never)]` 적용)한 결과, 전체 바이너리 용량을 약 160KB나 줄일 수 있었던 것으로 나타났습니다. 글쓴이는 컴파일러가 인라인되는 크기나 횟수에 별다른 제한을 두지 않고 있어, 실무의 복잡한 에러 트리 환경에서는 바이너리 용량 최적화 시 주의 깊게 살펴볼 만한 지점이라고 지적했습니다.
Sponsored · 광고