加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – g没有内联函数

发布时间:2020-12-16 06:45:46 所属栏目:百科 来源:网络整理
导读:有这样的代码: int fun1(){ return 2 + 3;}inline int fun2(){ return 4 + 5;}int main(){ int a = fun1(); int b = fun2(); return 0;} 和相应的汇编代码: .file "prog47.cpp" .text.globl _Z4fun1v .type _Z4fun1v,@function_Z4fun1v:.LFB0: .cfi_startp
有这样的代码:

int fun1(){
   return 2 + 3;
}

inline int fun2(){  
   return 4 + 5;
}

int main(){
    int a = fun1();
    int b = fun2();
    return 0;
}

和相应的汇编代码:

.file   "prog47.cpp"
    .text
.globl _Z4fun1v
    .type   _Z4fun1v,@function
_Z4fun1v:
.LFB0:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp,%ebp
    .cfi_offset 5,-8
    .cfi_def_cfa_register 5
    movl    $5,%eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE0:
    .size   _Z4fun1v,.-_Z4fun1v
    .section    .text._Z4fun2v,"axG",@progbits,_Z4fun2v,comdat
    .weak   _Z4fun2v
    .type   _Z4fun2v,@function
_Z4fun2v:
.LFB1:
    .cfi_startproc
    .cfi_personality 0x0,-8
    .cfi_def_cfa_register 5
    movl    $9,%eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE1:
    .size   _Z4fun2v,.-_Z4fun2v
    .text
.globl main
    .type   main,@function
main:
.LFB2:
    .cfi_startproc
    .cfi_personality 0x0,-8
    .cfi_def_cfa_register 5
    andl    $-16,%esp
    subl    $16,%esp
    call    _Z4fun1v
    movl    %eax,12(%esp)
    call    _Z4fun2v        # why fun2 is called?
    movl    %eax,8(%esp)
    movl    $0,%eax
    leave
    ret
    .cfi_endproc
.LFE2:
    .size   main,.-main
    .section    .note.GNU-stack,"",@progbits

为什么函数fun2没有内联并像普通函数一样被调用?我已经读过内联关键字只是提示编译器,它不需要内联函数,但是fun2的定义非常简单,因此可以内联.如何强制g内联函数?

解决方法

GCC有一个强制内联的属性:always_inline

inline int fun2()  __attribute__((always_inline));
inline int fun2() {  
   return 4 + 5;
}

将使其适用于任何优化设置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读