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

Ela*_*iss 4 c++ optimization

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

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

感觉不对.这是错的吗?

Ser*_*sen 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;
}
Run Code Online (Sandbox Code Playgroud)

main()的汇编器输出与-O optimization作为编译器标志:

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
Run Code Online (Sandbox Code Playgroud)

您可以看到调用了测试,并且EAX中的返回值存储在$ 0中.

现在让测试静态,并观察测试的调用消失,代码是内联的.