__assume 的文档说“__assume 最常见的用法是使用 switch 语句的默认情况,如下例所示。”。
- 是否有任何其他情况 __assume 可以导致更有效(甚至不同)的代码?
- 在 if / else 内部时,编译器是否会自动“假设”由于 if 条件而已经知道的内容?
我找不到任何可以显示上述任何内容的重要示例-我希望其他人可以。
__assume 的文档说“__assume 最常见的用法是使用 switch 语句的默认情况,如下例所示。”。
我找不到任何可以显示上述任何内容的重要示例-我希望其他人可以。
/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
选项)并查看生成的程序集(Alt+8
在 Visual Studio 中。)
if/else
现在考虑以内联方法测试上述条件。在某些情况下,程序员可能知道内联方法是使用特定值调用的,而优化器可能没有意识到这一事实。__assume
以上述方式在调用者级别使用,就在调用内联方法之前,理论上可以帮助优化器。
来自优化最佳实践:
__assume 已在 Visual C++ 中发布了多个版本,但它在 Visual C++ 2005 中变得更加有用。使用 __assume,开发人员可以告诉编译器对某个变量的值进行假设。
例如 __assume(a < 5); 告诉优化器在那一行代码中变量 a 小于 5。这也是对编译器的一个承诺。如果此时程序中的 a 实际上是 6,那么编译器优化后程序的行为可能不是您所期望的。__assume 在 switch 语句和/或条件表达式之前最有用。
__assume 有一些限制。首先,像 __restrict 一样,它只是一个建议,所以编译器可以随意忽略它。此外,__assume 目前仅适用于针对常量的变量不等式。它不会传播符号不等式,例如,假设(a < b)。