C++笔记(class18.7)函数调用约定和递归函数

本文介绍了函数调用约定的不同类型,如__cdecl、__stdcall和__fastcall,详细说明了参数传递和栈平衡的机制。在x64系统中,默认调用约定为__fastcall。此外,文中强调了递归函数必须有限制条件以防止栈溢出,并提供了一个代码示例展示如何优化字符串处理函数。
摘要由CSDN通过智能技术生成

目录

函数调用约定的定义

函数调用约定__cdecl

 函数调用约定__stdcall

 函数调用约定__fastcall

 其他调用约定

递归函数 


函数调用约定的定义

包含了:

一、如何传递参数

二、如何恢复栈平衡

函数调用约定__cdecl

 函数调用约定__stdcall

 函数调用约定__fastcall

有两个参数的时候,可以正好分配到两个寄存器,ecx和edx 

 有三个参数的时候,传递顺序依然是从右向左,前两个参数是由寄存器ecx和edx进行传递,最后一个参数,还是通过【push 】进行传递;

 

 【恢复栈平衡】通过函数本身进行恢复栈平衡

 其他调用约定

 补充:x64系统下默认的是__fastcall,

递归函数 

递归函数内部必须加限制条件,如果不加限制条件,可以想象:

ESP会一直移动,直到栈溢出。

内联函数【inline】不能写作递归函数

“栈"想必大家都很熟悉了,我们再重复一遍他的几个重要性质和概念。

  1. 先进后出。
  2. 在内存中表现为从高地址往低地址增长。
  3. 栈顶:栈的最上方(低地址区)。

     4.栈底:栈的最下方(高地址区)。

 

待改写的函数 

    int lstart{}, lfind{}, lend{};
    do
    {
        //从lfind=0;从第0个字节开始查询的,然后查询完第一个玩家的,要进行更新
        lfind = strData.find("id=", lfind);
        if (lfind == std::string::npos)break;
        lend = strData.find(";", lfind + 3);
        role[count].id = strData.substr(lfind + 3, lend - lfind - 3);
        lfind = lend + 1;//更新lfind
        lfind = strData.find("exp=", lfind);
        lend = strData.find(";", lfind + 4);
        //count++:先使用count参与运算,然后再++。这样就用一个语句实现了count的自动更新
        role[count++].exp = std::stoi(strData.substr(lfind + 4, lend - lfind - 4));
        lfind = lend + 1;//更新lfind
    } while (true);

改写后的函数 

void GetStr(Prole role, int lfind, string &strData)
{
    lfind = strData.find("id=", lfind);
    if (lfind == std::string::npos) return;
    int lend = strData.find(";", lfind + 3);
    role->id = strData.substr(lfind + 3, lend - lfind - 3);
    lfind = lend + 1;//更新lfind
    lfind = strData.find("exp=", lfind);
    lend = strData.find(";", lfind + 4);
    //count++:先使用count参与运算,然后再++。这样就用一个语句实现了count的自动更新
    role->exp = std::stoi(strData.substr(lfind + 4, lend - lfind - 4));
    lfind = lend + 1;//更新lfind

    return GetStr(++role, lfind, strData);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值