为啥在 __assume 中使用函数调用时 MSVC 不报错?
Posted
技术标签:
【中文标题】为啥在 __assume 中使用函数调用时 MSVC 不报错?【英文标题】:Why doesn't MSVC give out an error when using function calls in __assume?为什么在 __assume 中使用函数调用时 MSVC 不报错? 【发布时间】:2014-01-03 00:52:07 【问题描述】:当我使用 __assume(SomeFunc());它编译得很好,即使假设应该是编译时提示,并且 SomeFunc() 不能在编译时预测它的返回值。有人可以解释这里发生了什么吗?
【问题讨论】:
【参考方案1】:
SomeFunc()
无法在编译时预测其返回值。
编译器可能无法在编译时计算返回值,但这没关系。
当您使用__assume(expression)
时,程序员您 告诉编译器“此表达式的计算结果始终为true
。”您正在向编译器提供额外的信息,否则它可能无法从源代码中推导出来。
如果表达式在运行时计算时碰巧没有计算为true
,则行为未定义。您有责任仅在保证表达式为true
的情况下使用__assume
。
【讨论】:
【参考方案2】:通常函数可以在编译时预测其返回值。即使不能,为什么__assume
编译失败?这是对优化器的提示。如果它不是一个有用的提示,它不会做任何有用的事情,但它没有理由失败。
另请注意,__assume
的文档建议在发布模式下将其用于断言。但是函数调用经常用在断言中。如果不允许 __assume
获取函数返回值,则需要两个不同的断言宏。
【讨论】:
以上是关于为啥在 __assume 中使用函数调用时 MSVC 不报错?的主要内容,如果未能解决你的问题,请参考以下文章
在列表上使用 += 时出现 UnboundLocalError。为啥直接调用 __iadd__ 时这里需要 `nonlocal` 可以正常工作?
为啥 Python 的 'len' 函数比 __len__ 方法快?