【问题标题】:if optimization at compile time [closed]如果在编译时优化[关闭]
【发布时间】:2016-02-04 13:12:29
【问题描述】:

我想知道编译器是否优化了编译时知道参数的C函数?

例如,在下面的代码中,由于已知 OR (||) 函数的参数之一为真,因此 if 函数的条件将始终为 true。会自动优化吗?可以推广到所有的C函数吗?

#define COND 1
int main(void)
{
    if(rand()%8<7 || COND)
        /*something*/
    return 0;
}

【问题讨论】:

  • 抱歉,您实际上是在问“编译器优化是如何工作的”。这可能是编译器设计中最广泛和最复杂的领域。它不仅取决于编译器,还取决于目标架构。整个区域称为“编译器构建”,我强烈建议您自己搜索。有大量文件可供查找。

标签: c function optimization compilation


【解决方案1】:

编译器可以优化代码中的 if 语句,因为条件总是为真。 as-if 规则允许这样做。但这是否完成取决于编译器及其优化级别。

【讨论】:

    【解决方案2】:

    C 编译器无法优化 rand() % 8 &lt; 7,因为调用 rand() 有副作用:即内部 seed 发生变异。

    显然,|| 的快捷方式属性意味着 rand() 不会在 if (1 || rand()) 的情况下被调用,但这是语言的明确定义的属性,而不是编译器主动做出的选择。

    编译器可以很好地优化出没有副作用的函数,尤其是那些在 C 标准库中定义的函数。

    【讨论】:

    • 有用的是注意到程序员可以提示编译器没有副作用以鼓励这种优化。 ideone.com/iEWTal
    【解决方案3】:

    是的,优化器确实会删除他们知道永远不会被采用的代码分支。无论如何,静态分析的深度会因编译器而异。

    我怀疑当前的编译器是否会推断出您提到的“复杂”算术表达式的上限/下限,以便对比较结果进行硬编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多