Sum*_*uma 8 optimization visual-studio-2005 compiler-optimization visual-c++
__assume的文档说"__assume的最常见用法是使用switch语句的默认情况,如下例所示."
我无法找到任何可以显示任何上述内容的非平凡的例子 - 我希望其他人可以.
请考虑使用/Ox交换机编译的以下代码:
if (1) {
printf("live code\n");
} else {
printf("dead code\n");
}
Run Code Online (Sandbox Code Playgroud)
优化器将优化掉else.现在考虑:
int x = 1;
if (x == 1) {
printf("live code\n");
} else {
printf("dead code\n");
}
Run Code Online (Sandbox Code Playgroud)
优化器将再次优化掉else.还要考虑:
int x = 1;
__assume(x != 1);
if (x == 1) {
printf("live code\n");
} else {
printf("dead code\n");
}
Run Code Online (Sandbox Code Playgroud)
优化器将优化if此时间 - 这是错误的.
要测试,在Release模式下构建测试程序(使用/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).