为啥在 __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__ 方法快?

为啥 Python 在创建实例时不调用实例方法 __init__() 而是调用类提供的 __init__() ?

为啥我在分析器中看到 __scalbnf?

我们如何/为啥使用 operator.abs

__init__ 为啥python类需要初始化