学东西一定要问为什么。
为什么需要函数调用约定?
试想这样一个问题,当调用一个由别人编写的函数时,需要注意什么问题。
小明同学编写了一个函数 foo(int a,int b,int c);
当你调用foo(1,2,3),参数如何传递,参数传递的顺序是什么,(当然还会涉及一些其他的问题)
你有3块不同的颜色的砖头(红,绿、蓝)
- 你可以通过双手(参数如何传递),分别 红 ,绿、 蓝 传递给另一面
- 你可以通过双手(参数如何传递),分别 蓝 ,绿 , 红 传递给另一面
- 你可以通过汽车(参数如何传递),分别 红 ,绿、 蓝 传递给另一面
不管通过什么样的方式,传递顺序如何。另一面都接收到了参数,但是我们两者一致要约定好规则(传递顺序等其他规范),这样接收方就不会错误的领会到我的意思
不管怎样说,阅读到这里,你应该知道了,函数调用是有约定的,不能瞎搞(虽然这个问题在你编写代码时,没有直接让你处理,但是毕竟该问题是存在的)
做了一个表格,大致有这些不全,维基调用约定的分类
在我做表格时,测试实例时,我发现同一种调用约定在不同的平台有不同的处理方式,所以笔记根本没法做,唯一能做到的是,理解函数调用有哪些情况,然后根据实际情况去总结,重点,重点
说明了那么多,你可能不理解,我拿例子来说明
fastcall
float __fastcall foo(int a,int b,int c,int d) { return 1.f;}
x86时情况
使用2个寄存器和内存(栈区)传递参数
x64时情况
使用4个寄存器传递参数 ,这里还有大于4个参数时的处理方式。
上面就是fastcall在不同的平台有不同的处理,这个问题也好理解,倒退5000年生火是一个问题,现在这个问题只需要你买一个打火机。
对应的问题就是,以前寄存器(一种容器,能存储少量的数据)不多,参数基本都采用内存(栈区)来传递,现在直接使用寄存器。注:(寄存器造价比内存高,意思就是寄存器读取数据快,内存相对寄存器慢)
所以不管你如何记忆,如何整理。我的理解来说一点意义都没,我只需要知道调用函数时有什么问题,不懂该约定时,那么直接看汇编。脑补画面(哦,原来VS X86,cdecl是 右到左传递参数,由调用者释放栈。这样做的好处是支持多参数)