我想知道编译器是否优化了在编译时知道参数的C函数吗?
例如,在下面的代码中,由于OR(||
)函数的一个参数已知为真,因此if
函数的条件始终为{{1 }}。它会自动优化吗?它可以推广到所有C函数吗?
true
答案 0 :(得分:2)
编译器可以优化代码中的if语句,因为条件总是为真。这允许 as-if 规则。但是否这样做取决于编译器及其优化级别。
答案 1 :(得分:2)
AC编译器无法优化rand() % 8 < 7
,因为调用rand()
会产生副作用:即内部种子会发生变异。
显然,||
的快捷方式属性意味着在rand()
的情况下不会调用if (1 || rand())
,但这是语言定义良好的属性,而不是编译器的选择主动。
编译器可以很好地优化没有副作用的函数,尤其是那些在C标准库中定义的函数。
答案 2 :(得分:0)
是的,优化器会删除他们知道永远不会采用的代码分支。无论如何,静态分析的深度因编译器而异。
我怀疑当前的编译器确实推断出“复杂”算术表达式的上限/下限,就像你提到的那样,以便对比较结果进行硬编码。