默认实参

带有默认值参数的函数(默认实参)
默认实参作为形参的初始值出现在形参列表中,我们可以为一个或多个形参定义默认值,不过需要注意,一个形参被赋予了默认值,它后面的所有形参都必须给定默认值。
(1)使用默认实参调用函数:如果想使用默认实参,只要在调用时省略该实参,但是只能省略尾部的实参,函数调用时实参按其位置解析,默认实参负责填补函数调用缺少的尾部实参,在设计时要合理设置形参的顺序。
(2)默认实参声明:在个id ing的作用于域中,一个形参只能被赋予一次默认实参,函数的后续生命只能为那些没有默认值的形参添加默认实参,而且该形参的右侧所有形参都必须有默认值。
(3)默认实参初始值:局部变量不能做默认实参,除此之外,只要表达式的类型能转换成形参所需要的类型,该表达式就能作为默认实参
(4)带有默认实参的函数提高了效率。
一次函数调用包含一系列的工作:调用前要先保存寄存器,并在恢复时返回;可能需要拷贝实参;程序转向一个新的位置继续执行。
例一:没有默认实参的函数调用 汇编分析

int sum(int a,int b)
{
    return a+b;
}
int main()
{
    int a = 10;
//mov dword ptr [ebp-4],0Ah 通过ebp指针的偏移量来访问栈中的局部变量
    int b = 20;//mov dword ptr [ebp-8],14h 
    sum(a,b);
//mov        eax,dword ptr [ebp-8]  拷贝ebp-8中的值到eax寄存器
//push       eax                  将eax入栈
//mov        ecx,dword ptr [ebp-4]  拷贝ebp-4中的值到ecx寄存器
//push       ecx                  将ecx入栈
//call        sum (0B4105Fh)       呼叫sum函数
//call指令做了两件事:跳转至sum,并记录下一行指令的地址         
    return 0;
}

若将代码中sum(a,b)换成sum(10,30),则只有三行汇编指令

int main()
{
    sum(10,30);
   //push        1Eh  
   //push        0Ah  
   //call        sum (010105Fh)
    return 0;
}

例二:定义一个默认实参
从汇编代码中可以看出,有默认值的参数,少了拷贝实参的过程,因此提高了函数调用的效率。

int sum(int a,int b=20)
{
    return a+b;
}
int main()
{
    int a = 10;
    //mov         dword ptr [a],0Ah
    //少了将第二个参数mov的过程,提高了效率
    sum(a);
    //push        14h  
    //mov         eax,dword ptr [a]  
    //push        eax  
    //call        sum (0105105Fh)  
    sum(20);
    //push        14h  
    //push        14h  
    //call        sum (0105105Fh)
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值