博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对函数调用约定的理解
阅读量:5050 次
发布时间:2019-06-12

本文共 1014 字,大约阅读时间需要 3 分钟。

学东西一定要问为什么。

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

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

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

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

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

  1. 你可以通过双手(参数如何传递),分别 红 ,绿、 蓝  传递给另一面
  2. 你可以通过双手(参数如何传递),分别 蓝 ,绿 , 红 传递给另一面
  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是 右到左传递参数,由调用者释放栈。这样做的好处是支持多参数)

 

 

 

 

  

转载于:https://www.cnblogs.com/binaryAnt/p/11124115.html

你可能感兴趣的文章
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>