c plus plus 不同的调用约定有什么不同的影响 ,分别代码举例
时间: 2024-05-15 14:16:30 浏览: 4
C++中常见的调用约定有C调用约定、标准调用约定、快速调用约定、thiscall调用约定和fastcall调用约定。不同的调用约定在传递参数、返回值和堆栈处理等方面有不同的影响。
以函数传递参数为例:
1. C调用约定:参数从右往左依次压入堆栈,由调用者清理堆栈。
```
extern "C" int add(int a, int b)
{
return a + b;
}
```
2. 标准调用约定:参数从右往左依次压入堆栈,由被调用函数清理堆栈。
```
int __stdcall add(int a, int b)
{
return a + b;
}
```
3. 快速调用约定:前两个参数通过寄存器传递,其他参数从右往左依次压入堆栈,由被调用函数清理堆栈。
```
int __fastcall add(int a, int b, int c, int d)
{
return a + b + c + d;
}
```
4. thiscall调用约定:第一个参数指向调用对象的指针,从右往左依次压入堆栈,由被调用函数清理堆栈。
```
class MyClass
{
public:
int add(int a, int b)
{
return a + b;
}
};
int main()
{
MyClass obj;
int ret = obj.add(1, 2);
return 0;
}
```
5. fastcall调用约定:前两个参数通过寄存器传递,第一个参数指向调用对象的指针放在ecx寄存器中,其他参数从右往左依次压入堆栈,由被调用函数清理堆栈。
```
class MyClass
{
public:
int add(int a, int b, int c, int d)
{
return a + b + c + d;
}
};
int main()
{
MyClass obj;
int ret = obj.add(1, 2, 3, 4);
return 0;
}
```