__assume 的一些示例会导致比“无默认值”更快的代码在开关?
__assume
的文档表示“__assume
最常见的用法是使用 switch
语句的默认情况,如以下示例所示。 ”。
- 是否有任何其他情况下
__assume
可以导致更高效(甚至不同)的代码? - 当在
if / else
内部时,编译器是否不会由于if
条件而自动“假设”已知的内容?
我无法找到任何显示上述任何内容的重要示例 - 我希望其他人可以。
The documentation for __assume
says "The most common use of __assume
is with the default case of a switch
statement, as shown in the following example.".
- Is there any other case where
__assume
can lead to more efficient (or even different) code? - When inside of an
if / else
, isn't the compiler automatically "assuming" what is already known because of theif
condition?
I was unable to find any non-trivial examples that show any of above - I hope someone else could.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请考虑使用
/Ox
< 编译的以下代码/a> 开关:优化器将优化掉
else
。现在考虑一下:优化器将再次优化掉
else
。还要考虑:优化器这次将优化掉
if
——这是错误的。要进行测试,请在发布模式下构建一个测试程序(使用
/Ox
和/Zi
选项)并查看生成的程序集(在 Visual Studio 中为Alt+8
)。现在考虑在内联方法中测试上述
if/else
条件。在某些情况下,程序员可能知道内联方法是使用特定值调用的,而优化器可能没有意识到这一事实。在调用内联方法之前,按照上面所示的方式在调用者级别使用 __assume 理论上可以帮助优化器。来自优化最佳实践(引自旧版本) :
Consider the following code, compiled with the
/Ox
switch:The optimizer will optimize away the
else
. Now consider:The optimizer will once again optimize away the
else
. Also consider:The optimizer will optimize away the
if
this time -- incorrectly so.To test, build a test program in Release mode (with the
/Ox
and/Zi
options) and look at the generated assembly (Alt+8
in Visual Studio.)Now consider the above
if/else
condition being tested in an inline method. In certain contexts, the programmer may know that the inline method is called with a particular value and the optimizer may not have realized this fact. Using__assume
at the caller level in the manner illustrated above, just before the inlined method is called, can theoretically help the optimizer.From Optimization Best Practices (quote from older version):