Rust에서 인라인은 언제 사용해야합니까?


85

Rust에는 다음 세 가지 유형 중 하나에서 사용할 수있는 "인라인"속성이 있습니다.

#[inline]

#[inline(always)]

#[inline(never)]

언제 사용해야합니까?

녹 참조, 우리는 볼 인라인 섹션의 속성을 말을

컴파일러는 내부 휴리스틱을 기반으로 함수를 자동으로 인라인합니다. 함수를 잘못 인라인하면 실제로 프로그램 속도가 느려질 수 있으므로주의해서 사용해야합니다.

Rust 내부 포럼에서 huon은 inline 지정 에 대해서도 보수적 이었습니다 .

그러나 우리 는 표준 라이브러리를 포함하여 Rust 소스에서 상당한 사용 을 볼 수 있습니다. 많은 인라인 속성이 한 줄 함수에 추가되므로 컴파일러가 참조에 따라 휴리스틱을 통해 쉽게 찾아 내고 최적화 할 수 있습니다. 실제로 필요하지 않습니까?

답변:


69

현재 Rust 컴파일러의 한 가지 제한은 LTO (Link-Time Optimization)를 사용하지 않는 경우 #[inline]상자에 표시되지 않은 함수를 인라인하지 않는다는 것입니다 . Rust는 LLVM의 LTO 구현이 대규모 프로젝트에 적합하지 않기 때문에 C ++와 유사한 별도의 컴파일 모델을 사용합니다. 따라서 다른 상자에 노출 된 작은 기능은 손으로 표시해야합니다. 이것은 좋은 상황이 아니며 LTO 및 MIR 인라이닝에 대한 개선 사항의 일부 조합으로 향후 수정 될 가능성이 있습니다.

#[inline(never)]디버깅에 유용합니다 (예상대로 작동하지 않는 코드 조각 분리). 이론적으로는 벤치마킹에 사용할 수 있지만 일반적으로 나쁜 생각입니다. 인라인을 해제해도 지속적인 전파와 같은 다른 절차 간 최적화가 방지되지 않습니다. 일반 코드의 경우 오류 처리에만 사용되는 자주 사용하는 도우미 함수가 있으면 코드 크기를 줄일 수 있습니다.

#[inline(always)]일반적으로 나쁜 생각입니다. 함수가 컴파일러가 기본적으로 인라인하지 않을만큼 충분히 크면 호출의 오버 헤드가 중요하지 않을만큼 충분히 큽니다 (과도한 인라인은 명령어 캐시 압력을 증가시킵니다). 예외가 있지만이를 정당화하려면 성능 측정이 필요합니다. 이 예 는 고려할 가치가있는 상황입니다. 코드 품질 #[inline(always)]을 향상시키는데도 사용할 수 -O0있지만 일반적으로 걱정할 가치가 없습니다.


19
참고 inline(never)패닉 내장 함수에 사용이 최적화는 패닉의 경우라고하지 인라인 기능을 수행되었는지 확인합니다.
oli_obk

4
-1 첫 번째 지점에 빠진 것이 있기 때문입니다. 일반 항목은 인스턴스화 될 때 효과적으로 컴파일되므로 상자간에 인라인 될 수 있으므로 인라인에 필요한 코드를 즉시 사용할 수 있습니다. 그리고 이것은 표시되지 않은 엄청난 수의 항목이 여전히 교차 상자에 인라인 될 수 있음을 의미합니다. 일부 기본 라이브러리 상자에서는 모든 항목이 일반적입니다!
bluss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.