__assume的文档说“__assume的最常见用法是使用switch语句的默认情况,如下例所示。”。
我无法找到任何可以显示上述任何内容的非常重要的例子 - 我希望其他人可以。
答案 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)中。