如果大家细心的话应该知道c/c++语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。
参数入栈顺序
c/c++中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。
参数传递和命名约定
Visual C/C++ 编译器支持以下调用约定。
关键字 | 堆栈清理 | 参数传递 |
---|---|---|
__cdecl | Caller | 以相反的顺序(从右到左)将参数压入堆栈 |
__clrcall | n/a | 按顺序(从左到右)将参数加载到 CLR 表达式堆栈 |
__stdcall | Callee | 以相反的顺序(从右到左)将参数压入堆栈 |
__fastcall | Callee | 存储在寄存器中,然后压入堆栈 |
__thiscall | Callee | 压入堆栈;此指针存储在 ECX 中 |
__vectorcall | Callee | 存储在寄存器中,然后以相反的顺序(从右到左)压入堆栈 |
官方详解可见:
https://msdn.microsoft.com/en-us/library/984x0h58(v=vs.120).aspx
通常情况下c/c++默认