다음을 통해 공유


__assume

Microsoft 전용

최적화 프로그램에 힌트를 전달합니다.

구문

__assume(
   expression
)

매개 변수

expression
연결할 수 있는 코드의 경우 으로 계산 true되는 모든 식입니다. 최적화 프로그램에서 연결할 수 없는 코드를 나타내는 데 사용합니다 0 .

설명

최적화 프로그램은 표시되는 expression true 조건이 키워드가 나타나고 수정될 때까지 expression true로 유지되는 지점(예: 변수에 할당됨)에 있다고 가정합니다. __assume이 최적화 프로그램에 전달하는 힌트를 적절하게 사용하면 최적화 성능을 개선할 수 있습니다.

__assume 문이 모순(항상 계산false되는 식)으로 작성되면 항상 로 __assume(0)처리됩니다. 코드가 예상대로 작동하지 않는 경우 앞에서 설명한 대로 정의한 코드가 유효하고 true유효한지 확인 expression 합니다. __assume(0) 문은 특수한 경우입니다. 연결할 수 없는 코드 경로를 나타내는 데 사용합니다 __assume(0) .

Warning

프로그램에서는 연결 가능한 경로에 잘못된 __assume 문을 포함하지 않아야 합니다. 컴파일러가 잘못된 __assume 문에 연결할 수 있는 경우 프로그램이 예측할 수 없으며 위험할 수 있는 동작을 수행할 수 있습니다.

이전 버전과의 호환성을 위해 _assume__assume의 동의어입니다. 단, 컴파일러 옵션 /Za(언어 확장 사용 안 함)가 지정된 경우는 예외입니다.

__assume 는 정품 내장 함수가 아닙니다. 함수로 선언할 필요가 없으며 지시문에 #pragma intrinsic 사용할 수 없습니다. 코드는 생성되지 않지만 최적화 프로그램에서 생성하는 코드가 영향을 받습니다.

어설션을 ASSERT 복구할 수 없는 경우에만 사용합니다__assume. 컴파일러가 오류 처리 코드를 최적화할 수 있으므로 후속 오류 복구 코드 있는 어설션에는 사용하지 __assume 마세요.

요구 사항

Intrinsic 아키텍처
__assume x86, ARM, x64, ARM64, ARM64EC

예시

다음 예제에서는 문의 대/소문자를 연결할 수 없음을 default switch 나타내는 데 사용하는 __assume(0) 방법을 보여줍니다. 가장 일반적인 사용입니다 __assume(0). 여기서 프로그래머가 가능한 p 입력은 1 또는 2뿐이라는 것을 알고 있습니다. p에 대해 다른 값이 전달되면 프로그램은 유효하지 않은 상태가 되어 예측할 수 없는 동작을 수행합니다.

// compiler_intrinsics__assume.cpp

void func1(int /*ignored*/)
{
}

int main(int p)
{
   switch(p)
   {
   case 1:
      func1(1);
      break;
   case 2:
      func1(-1);
      break;
   default:
      __assume(0);
      // This tells the optimizer that the default
      // cannot be reached. As so, it does not have to generate
      // the extra code to check that 'p' has a value
      // not represented by a case arm. This makes the switch
      // run faster.
   }
}

문의 결과로 __assume(0) 컴파일러는 사례 문에 표시되지 않는 값이 있는지 여부를 p 테스트하는 코드를 생성하지 않습니다.

식이 항상 런타임에 있는지 true 확실하지 않은 경우 함수를 assert 사용하여 코드를 보호할 수 있습니다. 이 매크로 정의는 문을 검사로 래핑합니다 __assume .

#define ASSUME(e) (((e) || (assert(e), (e))), __assume(e))

사례 최적화가 default 작동하려면 문은 __assume(0) 케이스 본문의 default 첫 번째 문이어야 합니다. 아쉽게도 assert 매크로에서 ASSUME 컴파일러가 이 최적화를 수행하지 못하게 합니다. 또는 다음과 같이 별도의 매크로를 사용할 수 있습니다.

#ifdef DEBUG
// This code is supposed to be unreachable, so assert
# define NODEFAULT   assert(0)
#else
# define NODEFAULT   __assume(0)
#endif
// . . .
   default:
      NODEFAULT;

Microsoft 전용 종료

참고 항목

컴파일러 내장 함수
키워드