如果此函数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;
}
指针操作很容易被消除。但我听说指针操作是特殊的,无法优化。
答案 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
),它会删除函数的代码。