C语言 time函数 开销,C语言: 函数调用的开销
初學(xué)C語(yǔ)言的時(shí)候,我們有時(shí)會(huì)聽說(shuō)函數(shù)調(diào)用會(huì)有一定的開銷,在進(jìn)行了進(jìn)一步學(xué)習(xí)之后,我們來(lái)看看原來(lái)聽說(shuō)的開銷指的什么。
下面是兩個(gè)非常簡(jiǎn)單的樣例,就不作解釋了:
函數(shù)調(diào)用版本C程序:
#include
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;
}
使用gcc匯編后:
.file "function.c"
.text
.globl _sum
.def _sum; .scl 2; .type 32; .endef
_sum:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
popl %ebp
ret
.def ___main; .scl 2; .type 32; .endef
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1, 28(%esp)
movl $1, 24(%esp)
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call _sum
movl %eax, 20(%esp)
movl $0, %eax
leave
ret
無(wú)函數(shù)調(diào)用版本c程序:
#include
int main()
{
int a = 1;
int b = 1;
int c;
c = a + b;
return 0;
}
使用gcc匯編后:
.file "no_function.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl $1, 12(%esp)
movl $1, 8(%esp)
movl 8(%esp), %eax
movl 12(%esp), %edx
addl %edx, %eax
movl %eax, 4(%esp)
movl $0, %eax
leave
ret
除了公共部分和指導(dǎo)信息之外,第一個(gè)匯編程序比第二個(gè)匯編程序多了以下內(nèi)容:
1
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
2
call _sum
3
pushl %ebp
movl %esp, %ebp
4
popl %ebp
ret
額外的開銷就體現(xiàn)在這4段代碼上了,我來(lái)一一解釋一下它們的作用:
1
參數(shù)入棧代碼,將函數(shù)參數(shù)入棧,這是現(xiàn)在函數(shù)調(diào)用的標(biāo)準(zhǔn)方式。參數(shù)越多,開銷越大
2
將控制權(quán)轉(zhuǎn)移至函數(shù)中
3
建立新的棧幀,也就是當(dāng)前函數(shù)使用的“一片”棧空間,使用ebp的值來(lái)標(biāo)識(shí)新的棧幀,因此要將原棧幀首地址保存下來(lái),方便回到原來(lái)的即調(diào)用者的棧幀
4
恢復(fù)原棧幀,然后將控制權(quán)轉(zhuǎn)移至調(diào)用者 從匯編的角度來(lái)看,這額外的開銷就是指的這不足十行的指令了,會(huì)對(duì)性能有多大影響呢?大概有那么一丁點(diǎn)。當(dāng)然,對(duì)于不同的函數(shù),以及不同的調(diào)用頻率,這個(gè)影響也不盡相同。當(dāng)然,這個(gè)程序是一個(gè)極端,它函數(shù)的功能代碼也只有3行,這樣的情況完全可以不用函數(shù)或者使用內(nèi)聯(lián)函數(shù)。所以是使用函數(shù)還是不使用函數(shù)呢?依我來(lái)看,為了程序的可讀性,我們還是犧牲那么一丁點(diǎn)的性能吧。
總結(jié)
以上是生活随笔為你收集整理的C语言 time函数 开销,C语言: 函数调用的开销的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux path减少,Linux的环
- 下一篇: 怎么在快手直播欢乐斗地主