函数参数只能通过栈传递吗?

2018-09-29 09:57:15 +08:00
 v2byy

在看《程序员的自我修养》一书中的调用惯例中,提到

函数参数的传递有多种方式,最常见的一种是通过栈传递。

其他的传递方式是什么呢?

4409 次点击
所在节点    程序员
28 条回复
seaswalker
2018-09-29 10:01:45 +08:00
寄存器
besto
2018-09-29 10:02:38 +08:00
全局变量(手动斜眼)
ipwx
2018-09-29 10:03:57 +08:00
比如寄存器传递。再比如栈&寄存器混合传递。

https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A
shench
2018-09-29 10:05:31 +08:00
寄存器(手动斜眼)
kljsandjb
2018-09-29 10:06:21 +08:00
寄存器不够用的话用栈?
pythonee
2018-09-29 10:06:50 +08:00
寄存器和栈有什么区别呢
reus
2018-09-29 10:09:08 +08:00
你喜欢的话,通过 U 盘传递都可以
innoink
2018-09-29 10:11:46 +08:00
还可以通过 tcp 传:)
besto
2018-09-29 10:13:48 +08:00
@pythonee 首先要了解栈传递是什么原理, 函数调用的时候, 参数其实是依次压栈进去的, 而通过寄存器传递直接访问寄存器就行了(当然, 一般为了保护环境 函数前后应该有把使用寄存器压入栈和出栈的操作)
pythonee
2018-09-29 10:31:58 +08:00
@besto 是说寄存器是全局的,栈是局部的?
hanangellove
2018-09-29 10:34:28 +08:00
堆栈在内存上,寄存器在 CPU 里面
hx1997
2018-09-29 10:55:26 +08:00
x86 一般是栈传递,x86-64 默认是寄存器,参数太多寄存器不够用时用栈辅助。
chiu
2018-09-29 11:37:43 +08:00
共享内存
YenvY
2018-09-29 12:45:52 +08:00
xuecat
2018-09-29 12:52:11 +08:00
你是想问:__stdcall、__cdecl 和__fastcall 这种传参约定吗?
co3site
2018-09-29 12:53:33 +08:00
cdcall、stdcall 是栈传递,fastcall 的话会用先用两寄存器,超过三参数还是给 push 到栈里面
定义全局变量参数结构,用指针传进去
icylogic
2018-09-29 13:05:00 +08:00
: calling convention
lcdxiangzi
2018-09-29 13:24:10 +08:00
有点晕呢,栈和寄存器是同一个维度的东西吗?寄存器是 CPU 封装的硬件,栈是软件开发使用的数据结构。与寄存器对应的应该是内存或者硬盘吧?为什么大家都说寄存器和栈呢?
dartabe
2018-09-29 13:27:28 +08:00
寄存器就是芯片内的 flip flop 栈是内存 sram 或者 dram 当然有可能高级语言有其他意思?
zhzer
2018-09-29 13:48:48 +08:00
local,各种 local

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX