gcc编译器如何在编译时链接内联函数

时间:2016-03-31 05:26:09

标签: c gcc inline

我试图了解内联函数如何在链接器上链接。

这是代码片段,我试图检查。

inline.c

#include<stdio.h>
#include"inline.h"
extern inline void in_fun();

void p_fun(void)
{
    printf("in %s\n",__func__);
}

int main()
{
    int a=5;
    printf("main: a=%d at %p\n",a,&a);
    in_fun();
    printf("main: a=%d at %p\n",a,&a);
    p_fun();
}

inline.h

inline void in_fun(void)
{
    int a=10;
    printf("inline: a=%d at %p\n",a,&a);
}

从维基百科我得到了内联函数定义

在C和C ++编程语言中,内联函数是使用关键字inline限定的函数;这有两个目的。首先,它充当编译器指令,建议(但不要求)编译器通过执行内联扩展来替换函数体,即通过在每个函数调用的地址处插入函数代码,从而节省了函数调用的开销。

所以从上面的代码我做了主要的反汇编, 对于内联函数,它也可以通过调用指令进行调用&amp;正常功能也会通过调用指令调用。

这是主要功能的反汇编部分

0x0804840b <+0>:    push   ebp
0x0804840c <+1>:    mov    ebp,esp
0x0804840e <+3>:    and    esp,0xfffffff0
0x08048411 <+6>:    sub    esp,0x20
0x08048414 <+9>:    mov    DWORD PTR [esp+0x1c],0x5
0x0804841c <+17>:   mov    edx,DWORD PTR [esp+0x1c]
0x08048420 <+21>:   mov    eax,0x804854f
0x08048425 <+26>:   lea    ecx,[esp+0x1c]
0x08048429 <+30>:   mov    DWORD PTR [esp+0x8],ecx
0x0804842d <+34>:   mov    DWORD PTR [esp+0x4],edx
0x08048431 <+38>:   mov    DWORD PTR [esp],eax
0x08048434 <+41>:   call   0x80482f4 <printf@plt>
0x08048439 <+46>:   call   0x80483c4 <in_fun>
0x0804843e <+51>:   mov    edx,DWORD PTR [esp+0x1c]
0x08048442 <+55>:   mov    eax,0x804854f
0x08048447 <+60>:   lea    ecx,[esp+0x1c]
0x0804844b <+64>:   mov    DWORD PTR [esp+0x8],ecx
0x0804844f <+68>:   mov    DWORD PTR [esp+0x4],edx
0x08048453 <+72>:   mov    DWORD PTR [esp],eax
0x08048456 <+75>:   call   0x80482f4 <printf@plt>
0x0804845b <+80>:   call   0x80483ee <p_fun>
0x08048460 <+85>:   leave  
0x08048461 <+86>:   ret  

所以我想知道如何在每个函数调用的地址插入函数代码是合理的&amp;它的执行速度有多快为什么内联函数只写在头文件中。

任何人都可以解释这一点。

0 个答案:

没有答案