__assume
[本文档仅供预览,并可能在以后的版本中更改。 Blank topics are included as placeholders.]
Microsoft 专用
通过表示对该优化器。
__assume(
expression
)
参数
- expression
假定计算结果为 true 的任何表达式。
备注
该优化器,假设 expression 表示的条件为 true 在关键字显示并保持为 true 的点,直到修改 expression (例如,通过对变量赋值)。 对提示的选择性使用传递给该优化器 __assume 可以改进优化。
警告
程序不能包含有关可访问的路径无效的 __assume 语句。如果编译器可以达到无效 __assume 语句,程序将导致不可预知和潜在危险的行为。
__assume 不是虚拟内部。 ,因为函数和它不能用于 #pragma intrinsic 指令,因此无需声明。 代码不会生成,不过,该优化器生成的代码受到影响。
,仅当断言不可中向后移动时,请使用 __assume 在 断言 。 不要使用 __assume 中有后续错误纠正代码的断言,因为编译器可能优化错误处理代码。
__assume(0) 语句是一个特例。 使用 __assume(0) 指示无法到达的代码路径。 下面的示例演示如何使用 __assume(0) 意味着 switch 语句的默认情况下无法到达。 这是对 __assume(0)的最典型用法。
要求
内部 |
体系结构 |
---|---|
__assume |
x86, IPF, x64 |
示例
// compiler_intrinsics__assume.cpp
#ifdef DEBUG
# define ASSERT(e) ( ((e) || assert(__FILE__, __LINE__) )
#else
# define ASSERT(e) ( __assume(e) )
#endif
void func1(int i)
{
}
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 的唯一可能的输入将为 1 或 2。 如果另一个值为 p通过,程序将失效并导致不可预知的行为。
由于 __assume(0) 语句,编译器不生成代码测试 p 是否在 case 语句不表示的值。 为了使工作, __assume(0) 语句必须位于默认情况下主体的第一个语句。
由于编译器生成基于 __assume的代码,该代码可能无法正确运行,如果在 __assume 语句中的表达式为 false 在运行时。 如果您不确定该表达式将始终为 true,可以在运行时使用 assert 函数保护代码。
# define ASSERT(e) ( ((e) || assert(__FILE__, __LINE__)), __assume(e) )
遗憾的是,对 assert 的这种用法阻止编译器执行中前面所述文档的默认情况下优化。 或者,可以使用单独的宏,如下所示。
#ifdef DEBUG
# define NODEFAULT ASSERT(0)
#else
# define NODEFAULT __assume(0)
#endif
default:
NODEFAULT;