只调用一次的大型函数可以内联吗?

时间:2016-05-10 11:33:44

标签: c++ optimization

一位朋友写了一个函数,大约300行代码,并问我如何把它变成内联。

我告诉他这太大了,会导致指令通缉。然后我想,但他只召唤一次此功能。所以,没有任何缺点。

感觉不对。这是错的吗?

3 个答案:

答案 0 :(得分:9)

Gcc做了这个优化。静态函数仅在内联后调用。它不会对外部函数执行此操作,因为它无法确定谁调用函数。

您可以通过此处查看汇编程序:

https://gcc.godbolt.org/

首先使用 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)

如果您将使用此功能两次,不应该内联,但如果您只使用它一次,那么它可以是内联的。