gpt4 book ai didi

c++ - g++ 不内联函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:36 24 4
gpt4 key购买 nike

有这样的代码:

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,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -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,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -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 没有像普通函数那样被内联和调用?我读过 inline 关键字只是编译器的提示,它不必内联函数,但是 fun2 的定义非常简单,因此可以内联。如何强制 g++ 内联函数?

最佳答案

开启优化。这是您使用 -O2 (x86_64) 获得的 main 函数:

0000000000400560 <main>:
400560: 31 c0 xor %eax,%eax
400562: c3 retq

它不仅是内联的,而且被删除了。

如果没有优化,编译器不太可能内联。 (内联使代码更难调试,因此只有非常适中的内联级别和默认的非优化选项是个好主意。)

关于c++ - g++ 不内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com