• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2byy
V2EX  ›  程序员

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

  •  
  •   v2byy · Sep 29, 2018 · 5600 views
    This topic created in 2960 days ago, the information mentioned may be changed or developed.

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

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

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

    28 replies  •  2019-04-19 15:39:12 +08:00
    seaswalker
    seaswalker
    Sep 29, 2018 via iPhone
    1
    寄存器
    besto
    besto
    Sep 29, 2018
    2
    全局变量(手动斜眼)
    ipwx
    ipwx
    Sep 29, 2018❤️1
    3
    比如寄存器传递。再比如栈&寄存器混合传递。

    https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A
    shench
    shench
    Sep 29, 2018
    4
    寄存器(手动斜眼)
    kljsandjb
    kljsandjb
    Sep 29, 2018 via iPhone
    5
    寄存器不够用的话用栈?
    pythonee
    pythonee
    Sep 29, 2018
    6
    寄存器和栈有什么区别呢
    reus
    reus
    Sep 29, 2018
    7
    你喜欢的话,通过 U 盘传递都可以
    innoink
    innoink
    Sep 29, 2018
    8
    还可以通过 tcp 传:)
    besto
    besto
    Sep 29, 2018
    9
    @pythonee 首先要了解栈传递是什么原理, 函数调用的时候, 参数其实是依次压栈进去的, 而通过寄存器传递直接访问寄存器就行了(当然, 一般为了保护环境 函数前后应该有把使用寄存器压入栈和出栈的操作)
    pythonee
    pythonee
    Sep 29, 2018
    10
    @besto 是说寄存器是全局的,栈是局部的?
    hanangellove
    hanangellove
    Sep 29, 2018
    11
    堆栈在内存上,寄存器在 CPU 里面
    hx1997
    hx1997
    Sep 29, 2018 via Android
    12
    x86 一般是栈传递,x86-64 默认是寄存器,参数太多寄存器不够用时用栈辅助。
    chiu
    chiu
    Sep 29, 2018 via Android
    13
    共享内存
    xuecat
    xuecat
    Sep 29, 2018
    15
    你是想问:__stdcall、__cdecl 和__fastcall 这种传参约定吗?
    co3site
    co3site
    Sep 29, 2018 via Android
    16
    cdcall、stdcall 是栈传递,fastcall 的话会用先用两寄存器,超过三参数还是给 push 到栈里面
    定义全局变量参数结构,用指针传进去
    icylogic
    icylogic
    Sep 29, 2018 via iPhone
    17
    : calling convention
    lcdxiangzi
    lcdxiangzi
    Sep 29, 2018❤️1
    18
    有点晕呢,栈和寄存器是同一个维度的东西吗?寄存器是 CPU 封装的硬件,栈是软件开发使用的数据结构。与寄存器对应的应该是内存或者硬盘吧?为什么大家都说寄存器和栈呢?
    dartabe
    dartabe
    Sep 29, 2018❤️1
    19
    寄存器就是芯片内的 flip flop 栈是内存 sram 或者 dram 当然有可能高级语言有其他意思?
    zhzer
    zhzer
    Sep 29, 2018 via Android
    20
    local,各种 local
    v2byy
    v2byy
    OP
    Sep 29, 2018
    21
    @lcdxiangzi 这里说的栈就是进程的虚拟地址空间里分配的一段空间吧
    adminii
    adminii
    Sep 29, 2018
    22
    当然在堆栈(栈结构的内存),寄存器就那几个不够用。
    polythene
    polythene
    Sep 29, 2018
    23
    如果是手动实现一个解释器的话(不管是高级语言还是汇编层面),一般会有两种模式,基于栈或者基于寄存器。基于栈的顾名思义就是每个函数都有独立的栈,每一次操作都是对这个栈内的数据进行运算。
    tmy
    tmy
    Sep 29, 2018
    24
    linux 下 x64 是用寄存器,寄存器不够再用栈,细节可以把 c 代码编译成汇编,一看就知道了
    Fxhcu7By
    Fxhcu7By
    Sep 29, 2018
    25
    stdcall、cdecl、fastcall、thiscall 百度一下这些名词即可,学学汇编就懂了,可以理解函数的本质。
    hx1997
    hx1997
    Sep 29, 2018
    26
    @lcdxiangzi #18 这个栈是特指系统栈( system stack )或者叫调用栈( call stack )
    Greenm
    Greenm
    Oct 2, 2018 via iPhone
    27
    在 64 位的 linux 系统上,所有的系统调用(syscall)都是通过寄存器而不是通过堆栈传递的。
    coffeegeorge
    coffeegeorge
    Apr 19, 2019
    28
    @YenvY 很有意思,多谢!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   869 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 127ms · UTC 21:44 · PVG 05:44 · LAX 13:44 · JFK 16:44
    ♥ Do have faith in what you're doing.