Rust의 derive는 종종 inline을 암묵적으로 포함함

43 minutes ago 1

Rust는 현재 #[derive(...)]로 생성하는 구현에 #[inline]을 추가함. 보장된 동작은 아닌 것으로 보이지만, 레퍼런스 예제와 매크로 확장에서 확인할 수 있음 #[inline]은 힌트일 뿐이며, 자동 생성한 Debug, Clone 등의 구현은 대개 단순해 인라이닝의 이점을 얻음 필드가 많고 중첩된 오류 계층에서는 Debug 구현의 인라이닝으로 상당한 코드가 호출 지점마다 들어갈 수 있으며, 디버그/트레이스 로깅에서 이런 호출이 반복될 수 있음 uv에서는 특정 Debug 구현의 인라이닝을 막아 바이너리 크기를 약 160KB 줄임 이 사례에서는 rustc가 인라이닝 크기나 횟수를 제한하지 않는 것으로 보였음. 다만 이런 결정이 많은 프로그램에서는 적절할 수 있음 derive가 생성하는 인라이닝 힌트 Rust에서는 #[derive(...)] 로 트레이트 구현을 자동 생성하는 방식을 널리 사용함 현재 생성되는 구현에는 #[inline] 이 붙음. 보장된 동작인지는 불확실하지만, Rust 레퍼런스의 예제에서도 확인할 수 있음 foo: u32, bar: usize 필드를 가진 Widgets에 #[derive(Debug)]를 적용한 Playground 예제를 확장하면 다음 구현을 얻음 생성된 Debug 구현에는 #[automatically_derived]가, fmt 메서드에는 #[inline] 이 붙음 fmt는 Formatter::debug_struct_field2_finish에 구조체 이름과 두 필드의 이름/참조를 전달함 #[inline]은 강제가 아닌 힌트이며, 자동 생성된 Debug, Clone 등의 구현은 흔히 단순하므로 거의 항상 바람직한 선택임 중첩된 오류 타입과 바이너리 크기 예제 오류 계층은 7개의 String 필드를 가진 ErrorA, 이를 감싼 ErrorB, 다시 이를 감싼 ErrorC, 세 타입을 각각 변형으로 담는 Errors 열거형으로 구성됨 실제 Rust 애플리케이션은 필드가 상당히 많고 깊게 중첩된 오류 열거형을 사용하는 경우가 많아, 이 예제는 크게 단순화한 형태임 확장 결과에서는 각 타입의 Debug::fmt에 #[inline] 이 붙음 ErrorA는 필드 이름 배열과 &dyn Debug 참조 배열을 만들어 debug_struct_fields_finish를 호출함 ErrorB와 ErrorC는 debug_struct_field1_finish로 내부 필드를 포맷함 Error...

Read Entire Article