__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 전용 종료