带默认值参数的函数即在函数定义或声明时,我们可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。如果在函数的声明和定义中同时设置同一个参数的默认值时,则要求默认值设置是相同。
int sum(int a = 10, int b = 20);
int sum(int a, int b)
{
return a + b;
}
int main()
{
sum(10,10);
// 00FE142E push 0Ah
// 00FE1430 push 0Ah
// 00FE1432 call sum(0FE105Fh)
// 00FE1437 add esp, 8
//
sum();
// 00FE143A push 14h
// 00FE143C push 0Ah
// 00FE143E call sum(0FE105Fh)
// 00FE1443 add esp, 8
/
int a = 10;
int b = 10;
sum(a, b);
//00FE1446 mov dword ptr[a], 0Ah
//00FE144D mov dword ptr[b], 0Ah
//00FE1454 mov eax, dword ptr[b]
//00FE1457 push eax
//00FE1458 mov ecx, dword ptr[a]
//00FE145B push ecx
//00FE145C call sum(0FE105Fh)
//00FE1461 add esp, 8
}
当调用一个带默认值参数的函数时,如果没有给相应的实参,那么编译器就会自动把默认值传递给函数,如果有实参,则使用调用函数传递的实参值。
但是,不管使用还是不使用默认参数,从函数调用的汇编指令上来看,相应的参数都会有压栈操作,因此带默认值参数的函数不会影响汇编上CPU的push指令。
但在某些情况还有有一定的区别的,这种区别体现在:
当传给函数的实参为变量时,此时从汇编上来看,需要先从内存中取变量的值,增加了mov指令,相对的效率就会降低。而当使用立即数作为实参传给函数时,这种情况与使用默认值参数的函数所产生汇编指令是相同的,所以效率也是相同的。