关于消除C中内联函数指针操作的编译器优化?

时间:2011-03-12 06:46:19

标签: c optimization pointers compiler-construction

如果此函数Func1已内联,

inline int Func1 (int* a)
{
    return *a + 1;
}

int main ()
{
    int v = GetIntFromUserInput(); // Unknown at compile-time.   
    return Func1(&v);
}

我能指望智能编译器消除指针操作吗? (&a*a) 正如我猜的那样,该函数将转换为类似的东西,

int main ()
{
    int v = GetIntFromUserInput(); // Unknown at compile-time.
    int* a = &v;
    return *a + 1;
}

最后,

int main ()
{
    int v = GetIntFromUserInput(); // Unknown at compile-time.
    return v + 1;
}

指针操作很容易被消除。但我听说指针操作是特殊的,无法优化。

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:4)

可能发生这种情况是合理的。例如,gcc -O3会这样做:

.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        call    GetIntFromUserInput
        movl    %ebp, %esp
        popl    %ebp
        addl    $1, %eax
        ret

请注意,它从函数中获取返回值,添加一个并返回。

有趣的是,它也编译了一个Func1,可能因为inline似乎应该具有static的含义,但外部函数(如GetIntFromUserInput)应该能够调用它。如果我添加static(并离开inline),它会删除函数的代码。