对函数调用约定的理解

学东西一定要问为什么。

为什么需要函数调用约定?

试想这样一个问题,当调用一个由别人编写的函数时,需要注意什么问题。

小明同学编写了一个函数  foo(int a,int b,int c);

当你调用foo(1,2,3),参数如何传递,参数传递的顺序是什么,(当然还会涉及一些其他的问题)

你有3块不同的颜色的砖头(红,绿、蓝)

  1. 你可以通过双手(参数如何传递),分别 红 ,绿、 蓝  传递给另一面
  2. 你可以通过双手(参数如何传递),分别 蓝 ,绿 , 红 传递给另一面
  3. 你可以通过汽车(参数如何传递),分别 红 ,绿、 蓝  传递给另一面

不管通过什么样的方式,传递顺序如何。另一面都接收到了参数,但是我们两者一致要约定好规则(传递顺序等其他规范),这样接收方就不会错误的领会到我的意思

不管怎样说,阅读到这里,你应该知道了,函数调用是有约定的,不能瞎搞(虽然这个问题在你编写代码时,没有直接让你处理,但是毕竟该问题是存在的)

 做了一个表格,大致有这些不全,维基调用约定的分类

扫描二维码关注公众号,回复: 6709669 查看本文章

在我做表格时,测试实例时,我发现同一种调用约定在不同的平台有不同的处理方式,所以笔记根本没法做,唯一能做到的是理解函数调用有哪些情况,然后根据实际情况去总结,重点,重点


说明了那么多,你可能不理解,我拿例子来说明

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是 右到左传递参数,由调用者释放栈。这样做的好处是支持多参数)

  

猜你喜欢

转载自www.cnblogs.com/binaryAnt/p/11124115.html