目录
函数调用约定的定义
包含了:
一、如何传递参数
二、如何恢复栈平衡
函数调用约定__cdecl
函数调用约定__stdcall
函数调用约定__fastcall
有两个参数的时候,可以正好分配到两个寄存器,ecx和edx
有三个参数的时候,传递顺序依然是从右向左,前两个参数是由寄存器ecx和edx进行传递,最后一个参数,还是通过【push 】进行传递;
【恢复栈平衡】通过函数本身进行恢复栈平衡
其他调用约定
补充:x64系统下默认的是__fastcall,
递归函数
递归函数内部必须加限制条件,如果不加限制条件,可以想象:
ESP会一直移动,直到栈溢出。
内联函数【inline】不能写作递归函数
“栈"想必大家都很熟悉了,我们再重复一遍他的几个重要性质和概念。
- 先进后出。
- 在内存中表现为从高地址往低地址增长。
- 栈顶:栈的最上方(低地址区)。
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);
}