C语言: 函数调用的开销
轉載請注明來源 http://blog.csdn.net/imred/article/details/48865359
初學C語言的時候,我們有時會聽說函數調用會有一定的開銷,在進行了進一步學習之后,我們來看看原來聽說的開銷指的什么。
下面是兩個非常簡單的樣例,就不作解釋了:
函數調用版本C程序:
int sum(int a, int b)
{
return a + b;
}
int main()
{
int a = 1;
int b = 1;
int c;
c = sum(a, b);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
使用gcc匯編后:
.file "function.c".text.globl _sum.def _sum; .scl 2; .type 32; .endef _sum:pushl %ebpmovl %esp, %ebpmovl 12(%ebp), %eaxmovl 8(%ebp), %edxaddl %edx, %eaxpopl %ebpret.def ___main; .scl 2; .type 32; .endef.globl _main.def _main; .scl 2; .type 32; .endef _main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1, 28(%esp)movl $1, 24(%esp)movl 24(%esp), %eaxmovl %eax, 4(%esp)movl 28(%esp), %eaxmovl %eax, (%esp)call _summovl %eax, 20(%esp)movl $0, %eaxleaveret- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
無函數調用版本c程序:
#include <stdio.h>int main()
{
int a = 1;
int b = 1;
int c;
c = a + b;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
使用gcc匯編后:
.file "no_function.c".def ___main; .scl 2; .type 32; .endef.text.globl _main.def _main; .scl 2; .type 32; .endef _main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $16, %espcall ___mainmovl $1, 12(%esp)movl $1, 8(%esp)movl 8(%esp), %eaxmovl 12(%esp), %edxaddl %edx, %eaxmovl %eax, 4(%esp)movl $0, %eaxleaveret- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
除了公共部分和指導信息之外,第一個匯編程序比第二個匯編程序多了以下內容:
1
movl 24(%esp), %eaxmovl %eax, 4(%esp)movl 28(%esp), %eaxmovl %eax, (%esp)- 1
- 2
- 3
- 4
2
call _sum- 1
3
pushl %ebpmovl %esp, %ebp- 1
- 2
4
popl %ebpret- 1
- 2
額外的開銷就體現在這4段代碼上了,我來一一解釋一下它們的作用:
1
參數入棧代碼,將函數參數入棧,這是現在函數調用的標準方式。參數越多,開銷越大
2
將控制權轉移至函數中
3
建立新的棧幀,也就是當前函數使用的“一片”棧空間,使用ebp的值來標識新的棧幀,因此要將原棧幀首地址保存下來,方便回到原來的即調用者的棧幀
4
恢復原棧幀,然后將控制權轉移至調用者
從匯編的角度來看,這額外的開銷就是指的這不足十行的指令了,會對性能有多大影響呢?大概有那么一丁點。當然,對于不同的函數,以及不同的調用頻率,這個影響也不盡相同。當然,這個程序是一個極端,它函數的功能代碼也只有3行,這樣的情況完全可以不用函數或者使用內聯函數。所以是使用函數還是不使用函數呢?依我來看,為了程序的可讀性,我們還是犧牲那么一丁點的性能吧。
轉載請注明來源 http://blog.csdn.net/imred/article/details/48865359
總結
以上是生活随笔為你收集整理的C语言: 函数调用的开销的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 共享库(动态库)制作
- 下一篇: Keil5.26、Keil5.27、Ke