C 编译时的if优化

C 编译时的if优化,c,function,optimization,compilation,C,Function,Optimization,Compilation,我想知道编译器是否在编译时优化参数已知的C函数 例如,在下面的代码中,由于OR(|)函数的参数之一已知为true,因此if函数的条件将始终为true。它会自动优化吗?它能推广到所有C函数吗 #define COND 1 int main(void) { if(rand()%8<7 || COND) /*something*/ return 0; } #定义条件1 内部主(空) { if(rand()%8编译器可以优化代码中的if语句,因为条件总是为真。这是

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

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

#define COND 1
int main(void)
{
    if(rand()%8<7 || COND)
        /*something*/
    return 0;
}
#定义条件1
内部主(空)
{

if(rand()%8编译器可以优化代码中的if语句,因为条件总是为真。这是“如同”规则允许的。但是否这样做取决于编译器及其优化级别。

编译器可以优化代码中的if语句,因为条件总是为真。这是允许的但这取决于编译器及其优化级别。

C编译器无法优化
rand()%8<7
,因为调用
rand()
会产生副作用:即内部种子发生变异

显然,
|
的shortcutting属性意味着如果(1 | | rand())
的情况下,
rand()
将不会被调用,但这是语言定义良好的属性,而不是编译器主动做出的选择


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

C编译器无法优化出
rand()%8<7
,因为调用
rand()
会产生副作用:即内部种子发生变异

显然,
|
的shortcutting属性意味着如果(1 | | rand())的情况下,
rand()
将不会被调用,但这是语言定义良好的属性,而不是编译器主动做出的选择


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

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


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

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


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

对不起,B但您实际上会问“编译器优化是如何工作的?”。这可能是编译器设计中最广泛、最复杂的领域。这不仅取决于编译器,还取决于目标体系结构。整个领域称为“编译器构造”,我强烈建议您自己搜索。有大量文档可供查找。抱歉,B但您确实提出了要求“编译器优化是如何工作的”。这可能是编译器设计中最广泛、最复杂的领域。它不仅取决于编译器,还取决于目标体系结构。整个领域称为“编译器构造”“我强烈建议您自己搜索。有大量文档可供查找。值得注意的是,程序员可以提示编译器没有副作用,以鼓励此类优化。值得注意的是,程序员可以提示编译器没有副作用,以鼓励此类优化。