【方辉专栏】ARM嵌入式编译器(六) 内联函数
发布时间:2022-08-17

摘要: 本文主要对Arm Compiler 6编译器中内联函数进行介绍。

关键字:Arm Compiler 6、编译器、内联函数


如果Arm Compiler 6认为内联此函数可以提高性能同时不会显著增加代码量,就会自动优化为内联函数。当然您也可以使用编译器选项来控制函数是否进行内联。

内联选项或属性说明
__inline__提示编译器可以进行内联,但是否内联仍取决于编译器。
__attribute__((always_inline))提示编译器始终内联此函数。
__attribute__((noinline))提示编译器不要内联此函数。
-fon-inline-functions这个编译命令选项会禁止编译器进行内联,同时也使得__inline__失效。

注1:自动内联通常只有在优化等级为-O2或更高等级时才会进行,除非您使用了__attribute__((always_inline)),才会在低优化等级中进行。

注2:Arm Compiler 6编译器仅在同一个源文件内进行自动内联函数。


以下是一个__attribute__((always_inline))的例子:


int bar(int a)

{

    a=a*(a+1);

    return a;

}

__attribute__((always_inline)) static int row(int a)

{

    a=a*(a+1);

    return a;

}

int foo (int i)

{

    i=bar(i);

    i=i-2;

    i=bar(i);

    i++;

    i=row(i);

    i++;

    return i;

}


在以上代码中,函数bar和row功能相同,只是row声明始终内联。

使用-O2进行编译,使用一个含有选项-fon-inline-functions,另一个不含有-fon-inline-functions选项进行编译。


编译命令分别如下:

有-fon-inline-functions选项:

armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s -fon-inline-functions


无-fon-inline-functions选项:

armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s

编译后反汇编结果如下:

使用-fon-inline-functions代码不使用-fon-inline-functions代码
foo: @ @foo
.fnstart
@ BB#0:
.save {r11, lr}
push {r11, lr}
bl bar
sub r0, r0, #2
bl bar
add r1, r0, #1
add r0, r0, #2
mul r0, r0, r1
add r0, r0, #1
pop {r11, pc}
.Lfunc_end0:
.size foo, .Lfunc_end0-foo
.cantunwind
.fnend
foo: @ @foo
.fnstart
@ BB#0:
add r1, r0, #1
mul r0, r1, r0
sub r1, r0, #2
sub r0, r0, #1
mul r0, r0, r1
add r1, r0, #1
add r0, r0, #2
mul r0, r0, r1
add r0, r0, #1
bx lr
.Lfunc_end0:
.size foo, .Lfunc_end0-foo
.cantunwind
.fnend

可以看到,使用-fon-inline-functions选项时,就不会对bar进行内联,而不使用的时候就会对bar进行内联,但对于row始终是进行内联的。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


关于九游会J9电子

九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。

欢迎关注“九游会J9电子”公众号

了解更多研发工具软件知识