一位朋友写了一个函数,大约300行代码,并问我如何把它变成内联。
我告诉他这太大了,会导致指令通缉。然后我想,但他只召唤一次此功能。所以,没有任何缺点。
感觉不对。这是错的吗?
答案 0 :(得分:9)
Gcc做了这个优化。静态函数仅在内联后调用。它不会对外部函数执行此操作,因为它无法确定谁调用函数。
您可以通过此处查看汇编程序:
首先使用 extern 功能:
#include <stdio.h>
extern int test(int x);
int main() {
int x = test(10);
printf("%d\n", x);
}
int test(int x)
{
volatile int y = x;
for (int i = 0; i < 10; i++)
y++;
for (int i = 0; i < 10; i++)
y++;
return y;
}
带有-O optimization的main()的汇编输出作为编译器标志:
main:
subq $8, %rsp
movl $10, %edi
call test(int)
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
addq $8, %rsp
ret
您可以看到调用测试并且EAX中的返回值存储在$ 0。
现在让测试静态,并观察测试的调用消失,代码内联。
答案 1 :(得分:4)
大型函数可以内联。 如果只调用一次,那么没有任何不利之处(除非您将来可能会开始更多地调用它)。
编译器是否实际优化了调用(在调用站点扩展函数),这是另一回事。如果函数具有内部链接,则很容易证明该函数只被调用一次。如果它有外部链接,则只能通过整个程序优化。
答案 2 :(得分:0)
如果您将使用此功能两次,不应该内联,但如果您只使用它一次,那么它可以是内联的。