如何使用-O2? 我的C计划低于C: __int64_t fib_tr_const(__int64_t n,__int64_t n_1,__int64_t n_2) { if(n == 0x42 || n == 0x43){ 返回n_1 + n_2; } 返回0x31 + fib_tr(n-1,n_2,n ...

问题描述 投票:0回答:0
我用

-O2

gcc tail_call.c -O2 -o tail_call_const_O2

我拆开了二进制的零件:

main():

00000000000010a0 <main>:
    10a0:   f3 0f 1e fa             endbr64 
    10a4:   41 54                   push   %r12
    10a6:   ba 0a 00 00 00          mov    $0xa,%edx
    10ab:   48 83 ec 10             sub    $0x10,%rsp
    10af:   48 8b 7e 08             mov    0x8(%rsi),%rdi
    10b3:   31 f6                   xor    %esi,%esi
    10b5:   e8 c6 ff ff ff          callq  1080 <strtol@plt>
    10ba:   48 8d 3d 43 0f 00 00    lea    0xf43(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    10c1:   48 c7 44 24 08 67 45    movq   $0x4567,0x8(%rsp)
    10c8:   00 00 
    10ca:   4c 63 e0                movslq %eax,%r12
    10cd:   e8 9e ff ff ff          callq  1070 <puts@plt>
    10d2:   48 8d 3d 2b 0f 00 00    lea    0xf2b(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    10d9:   e8 92 ff ff ff          callq  1070 <puts@plt>

-----------------------START----------------------

    10de:   49 8d 54 24 be          lea    -0x42(%r12),%rdx
    10e3:   b8 57 03 00 00          mov    $0x357,%eax
    10e8:   48 83 fa 01             cmp    $0x1,%rdx
    10ec:   76 33                   jbe    1121 <main+0x81>
    10ee:   49 8d 74 24 fe          lea    -0x2(%r12),%rsi
    10f3:   49 8d 54 24 ff          lea    -0x1(%r12),%rdx
    10f8:   b9 34 02 00 00          mov    $0x234,%ecx
    10fd:   48 83 fe 01             cmp    $0x1,%rsi
    1101:   77 08                   ja     110b <main+0x6b>
    1103:   eb 5a                   jmp    115f <main+0xbf>
    1105:   0f 1f 00                nopl   (%rax)
    1108:   48 89 f0                mov    %rsi,%rax
    110b:   48 83 ea 01             sub    $0x1,%rdx
    110f:   48 8d 34 01             lea    (%rcx,%rax,1),%rsi
    1113:   48 89 c1                mov    %rax,%rcx
    1116:   48 83 fa 02             cmp    $0x2,%rdx
    111a:   75 ec                   jne    1108 <main+0x68>
    111c:   48 8d 44 30 31          lea    0x31(%rax,%rsi,1),%rax
    1121:   48 8d 3d e2 0e 00 00    lea    0xee2(%rip),%rdi        # 200a <_IO_stdin_used+0xa>
    1128:   48 89 44 24 08          mov    %rax,0x8(%rsp)

-----------------------END----------------------


    
    112d:   e8 3e ff ff ff          callq  1070 <puts@plt>
    1132:   48 8d 3d d1 0e 00 00    lea    0xed1(%rip),%rdi        # 200a <_IO_stdin_used+0xa>
    1139:   e8 32 ff ff ff          callq  1070 <puts@plt>
    113e:   48 8b 4c 24 08          mov    0x8(%rsp),%rcx
    1143:   48 83 c4 10             add    $0x10,%rsp
    1147:   31 c0                   xor    %eax,%eax
    1149:   4c 89 e2                mov    %r12,%rdx
    114c:   48 8d 35 bd 0e 00 00    lea    0xebd(%rip),%rsi        # 2010 <_IO_stdin_used+0x10>
    1153:   bf 01 00 00 00          mov    $0x1,%edi
    1158:   41 5c                   pop    %r12
    115a:   e9 31 ff ff ff          jmpq   1090 <__printf_chk@plt>
    115f:   be 57 03 00 00          mov    $0x357,%esi
    1164:   b8 34 02 00 00          mov    $0x234,%eax
    1169:   eb b1                   jmp    111c <main+0x7c>
    116b:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

fib_tr_const():

00000000000012e0 <fib_tr_const>: 12e0: f3 0f 1e fa endbr64 12e4: 48 8d 4f be lea -0x42(%rdi),%rcx 12e8: 48 8d 04 16 lea (%rsi,%rdx,1),%rax 12ec: 48 83 f9 01 cmp $0x1,%rcx 12f0: 76 36 jbe 1328 <fib_tr_const+0x48> 12f2: 48 8d 4f ff lea -0x1(%rdi),%rcx 12f6: 48 83 ef 02 sub $0x2,%rdi 12fa: 48 83 ff 01 cmp $0x1,%rdi 12fe: 77 0b ja 130b <fib_tr_const+0x2b> 1300: eb 2e jmp 1330 <fib_tr_const+0x50> 1302: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 1308: 48 89 f0 mov %rsi,%rax 130b: 48 83 e9 01 sub $0x1,%rcx 130f: 48 8d 34 02 lea (%rdx,%rax,1),%rsi 1313: 48 89 c2 mov %rax,%rdx 1316: 48 83 f9 02 cmp $0x2,%rcx 131a: 75 ec jne 1308 <fib_tr_const+0x28> 131c: 48 8d 44 06 31 lea 0x31(%rsi,%rax,1),%rax 1321: c3 retq 1322: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 1328: c3 retq 1329: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 1330: 48 89 c6 mov %rax,%rsi 1333: 48 89 d0 mov %rdx,%rax 1336: eb e4 jmp 131c <fib_tr_const+0x3c> 1338: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 133f: 00

在地标
printf ("11111\n");

printf ("22222\n");
,因此在组装中,我相信
puts

START
之间的部分应该是
END
呼叫
main()
.
但我没有看到从main()到fib_tr_const()分支的任何
fib_tr_const()
call
指令。
那么如何调用此功能?

和i比较了介于fib_tr_const()的组件之间的组件,它们看起来相似,因此fib_tr_const()函数似乎是

In-in-lined
到main()。
因此,自然会出现另一个问题,如果该功能是衬有内衬的,为什么它仍然存在于二进制中? 
如果删除如果删除会节省更多空间? thanks.

这与

翻译单元的概念有关。

编译器处理的“单元”是“单元”,可以看作是带有所有随附的标头文件的单个源文件。 commince是所有编译器所知道的,它只能从当前的TU上进行内联函数,而不是其他任何TU的函数。但是,因此,编译器不知道是否可以从另一个TU使用这些函数,因此该函数实际上需要存在,因此,如果从另一个Tu中调用了链接器,则可以找到它。

c assembly gcc optimization
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.