我试图了解内联函数如何在链接器上链接。
这是代码片段,我试图检查。
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;它的执行速度有多快为什么内联函数只写在头文件中。
任何人都可以解释这一点。