为什么 MSVC 在 __assume 中使用函数调用时不给出错误?

Why doesn't MSVC give out an error when using function calls in __assume?

本文关键字:出错 错误 函数调用 MSVC assume 为什么      更新时间:2023-10-16

当我使用__assume(SomeFunc());时,它可以很好地编译,即使__assume应该是一个编译时提示,并且SomeFunc()不能在编译时预测其返回值。

有人可以解释一下这里发生了什么吗?

SomeFunc()不能在编译时预测其返回值。

编译器可能无法在编译时计算返回值,但这并不重要。

当你使用__assume(expression)时,,程序员,告诉编译器"这个表达式总是计算为true"。 您为编译器提供了额外的信息,否则它可能无法从源代码中推断出这些信息。

如果表达式在运行时计算时碰巧没有计算结果true,则行为未定义。 您有责任仅在保证表达式true的情况下使用 __assume

通常,函数可以在编译时预测其返回值。即使不能,__assume为什么要编译失败呢?这是对优化器的提示。如果它不是一个有用的提示,它不会做任何有用的事情,但没有理由让它失败。

另请注意,__assume的文档建议在发布模式下将其用于断言。但函数调用通常用于断言。如果不允许__assume采用函数返回值,则需要两个不同的断言宏。

相关文章: