#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
关键字附加到它吗?
编辑:对不起,我的意思是在最后的声明中有一个内联关键字!
答案 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))
例如),唯一的方法就是检查生成的汇编器或对象。