日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言: 函数调用的开销

發布時間:2024/4/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言: 函数调用的开销 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明來源 http://blog.csdn.net/imred/article/details/48865359
初學C語言的時候,我們有時會聽說函數調用會有一定的開銷,在進行了進一步學習之后,我們來看看原來聽說的開銷指的什么。
下面是兩個非常簡單的樣例,就不作解釋了:
函數調用版本C程序:

#include <stdio.h>

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语言: 函数调用的开销的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。