__assume的一些例子导致交换机中除“无默认”之外的代码更快?

时间:2010-06-22 20:37:01

标签: optimization visual-c++ visual-studio-2005 compiler-optimization

__assume的文档说“__assume的最常见用法是使用switch语句的默认情况,如下例所示。”。

  • 是否有其他情况__assume可以导致更高效(甚至不同)的代码?
  • 当在if / else里面时,编译器会自动“假设”因为if条件已经知道了什么?

我无法找到任何可以显示上述任何内容的非常重要的例子 - 我希望其他人可以。

1 个答案:

答案 0 :(得分:8)

考虑使用/Ox开关编译的以下代码:

if (1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

优化器将优化else。现在考虑:

int x = 1;
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

优化器将再次优化else。还要考虑:

int x = 1;
__assume(x != 1);
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

优化器此次将优化if - 错误地如此。

要测试,在发布模式下构建测试程序(使用/Ox/Zi选项)并查看生成的程序集(Visual Studio中的Alt+8)。

现在考虑在内联方法中测试上述if/else条件。在某些上下文中,程序员可能知道使用特定值调用内联方法,并且优化器可能没有意识到这一事实。以上面说明的方式在调用者级别使用__assume,就在调用内联方法之前,理论上可以帮助优化器。

来自Optimization Best Practices

  

__ assume已经在Visual C ++中   多个版本,但它已成为   在Visual C ++ 2005中更加可用。   使用__assume,开发人员可以说   编译器做出假设   某个变量的值。

     

例如__assume(a< 5);告诉了   在那行代码中的优化器   变量a小于5.再次   这是对编译器的承诺。如果   a实际上是6点   程序然后的行为   程序编译后有   优化可能不是你想要的   期望。 __assume是最有用的   切换语句和/或   条件表达式。

     

有一些限制   __假设。首先,像__restrict一样,它只是一个建议,所以编译器   可以随意忽略它。另外,__假   目前仅适用于变量   对常数的不等式。它   不传播象征性的   例如,不等式假设(a<   b)中。