内联函数与C语言函数调用有什么区别??
1个回答
展开全部
首先讲一下函数调用,C语言函数调用的过程是:
①将参数压栈,一般是从右往左。
②使用call指令,调用函数。call指令会将当前指令所在的内存位置压栈以便函数结束后返回。
③进入函数体(跳转到另一块内存中),执行,执行完后,使用通用寄存器或者栈来存储返回值,使用ret指令返回。
可以看到,函数调用是发生了跳转的,考虑一下跳转大小和指令预取这些东西,调用函数会加长执行时间。如果只是调用几次,时间差异可能感觉不出来,不是特别情况也不需要在乎。但函数被反复调用时,性能就会差很多。
所以有了内联函数这玩意,编译器会直接将对内联函数的调用扩展为整个函数的代码(几种情况除外,这个看书,我也记不住),也就是说,不会使用call和ret指令。所以,这样做的缺点就是每个调用函数的位置都被扩展成了函数的代码,会加大生成的可执行文件的大小。所以才会提倡,将调用频繁而函数本身却很小的函数声明为内联函数。
它们的区别就在这里,跳转和不跳转,牺牲时间还是牺牲空间。
①将参数压栈,一般是从右往左。
②使用call指令,调用函数。call指令会将当前指令所在的内存位置压栈以便函数结束后返回。
③进入函数体(跳转到另一块内存中),执行,执行完后,使用通用寄存器或者栈来存储返回值,使用ret指令返回。
可以看到,函数调用是发生了跳转的,考虑一下跳转大小和指令预取这些东西,调用函数会加长执行时间。如果只是调用几次,时间差异可能感觉不出来,不是特别情况也不需要在乎。但函数被反复调用时,性能就会差很多。
所以有了内联函数这玩意,编译器会直接将对内联函数的调用扩展为整个函数的代码(几种情况除外,这个看书,我也记不住),也就是说,不会使用call和ret指令。所以,这样做的缺点就是每个调用函数的位置都被扩展成了函数的代码,会加大生成的可执行文件的大小。所以才会提倡,将调用频繁而函数本身却很小的函数声明为内联函数。
它们的区别就在这里,跳转和不跳转,牺牲时间还是牺牲空间。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询