当我使用__assume(SomeFunc())时;它编译得很好,甚至假设应该是编译时提示而SomeFunc()不能在编译时预测它的返回值。有人可以解释这里发生了什么吗?
答案 0 :(得分:3)
SomeFunc()
无法在编译时预测其返回值。
编译器可能无法在编译时计算返回值,但这无关紧要。
当你使用__assume(expression)
,你时,程序员告诉编译器“这个表达式始终计算为true
。”您正在为编译器提供额外的信息,否则它可能无法从源代码中推断出来。
如果表达式在运行时评估为true
时没有评估,则行为未定义。只有在保证表达式为__assume
的情况下才使用true
。
答案 1 :(得分:1)
通常,函数可以在编译时预测其返回值。即使一个人不能,为什么__assume
无法编译?这是对优化器的暗示。如果它不是一个有用的提示,它将不会做任何有用的事情,但它没有理由失败。
另请注意,__assume
的文档建议将其用于发布模式下的断言。但函数调用通常用于断言。如果不允许__assume
获取函数返回值,则需要两个不同的断言宏。