这个函数是否考虑用于内联?

时间:2011-11-17 02:03:19

标签: c gcc inline declaration

#include <stdio.h>

static void test()
{
    printf("is this function considered for inline?");
}

int main()
{
    test(); // definition does not have inline keyword. But declaration at the bottom (which is never used) has a inline keyword.
}

inline static void test(); // definition WITH inline keyword

编译器会将test()视为inline关键字附加到它吗?

编辑:对不起,我的意思是在最后的声明中有一个内联关键字!

3 个答案:

答案 0 :(得分:1)

最好找出来的只是看看装配。

使GCC考虑用于内联的每个函数的编译器标志是-finline-functions。默认情况下会在-O3启用此功能。

因此,在-O3,即使未使用inline声明,GCC也会考虑内联的所有函数。

答案 1 :(得分:1)

使用gcc -S编译并查看汇编程序的外观,例如这是-O2 - 所以我们可以看到test()已经消失并内联。您应该有一个由gcc生成的.s文件

main:
.LFB12:
  .cfi_startproc
  movl  $.LC0, %edi
  xorl  %eax, %eax
  jmp   printf
  .cfi_endproc
.LFE12:

如果没有优化,我们可以看到对test()的调用

main:
.LFB1:
  .cfi_startproc
  pushq %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  $0, %eax
  call  test
  popq  %rbp
  .cfi_def_cfa 7, 8
  ret
  .cfi_endproc
.LFE1:

答案 2 :(得分:0)

inline关键字大概是用词不当,并不表示函数是否有效内联。如果将其添加到定义,它只会确保将此定义放在头文件中时,不会出现不同编译单元(.o文件)中“多个符号”的问题。不要寻求更多的东西。

如果函数有效内联或完全取决于编译器。如果产生外部符号(您的static定义),这甚至无关紧要。大多数编译器都有扩展来调节一点(gcc的__attribute__((always_inline))例如),唯一的方法就是检查生成的汇编器或对象。