__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;

请参见

参考

编译器内部函数

C++ 关键字