2016-06-05 1 views
24

녹 그 세 가지 맛 중 하나에서 사용할 수있는 "인라인"속성이있다? 녹 기준에서 언제 녹에서 인라인 사용해야합니까?</p> <p><code>#[inline]</code></p> <p><code>#[inline(always)]</code></p> <p><code>#[inline(never)]</code></p> <p>들이 사용되어야한다 :

, 우리는

컴파일러는 자동으로 내부 추론에 기초 기능을 인라인 말 an inline attributes section를 참조하십시오. 잘못 인라인 함수는 실제로 프로그램을 느리게 만들 수 있으므로주의해서 사용해야합니다.

녹 내부 포럼에서 huon도 conservative about specifying inline입니다.

그러나 우리는 표준 라이브러리를 포함하여 녹 소스에서 considerable usage을 봅니다. 한 줄 함수에 많은 인라인 속성이 추가되어 컴파일러가 참조에 따라 발견 적으로 발견하고 최적화하는 것이 쉬워야합니다. 실제로 필요한 것은 아닌가?

답변

27

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

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

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

+5

주의 : 'inline (never)'는 패닉 내장 함수에서 사용되어 최적화 프로그램이 패닉 경우에만 호출되는 함수를 인라인하지 않도록합니다. –