You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64汇编中结构体参数传递的判断方法与标准依据

AArch64结构体参数传递规则相关问题解答

问题1:从C函数声明判断ARM64汇编中结构体参数是传地址还是分寄存器传值

核心看复合类型的总大小(含内存对齐)和成员类型:

  • 若结构体/联合体的总大小 ≤ 16字节,且所有成员都是可通过寄存器传递的基本数值类型(如int、float、double等,无嵌套复杂复合类型、变长数组、函数指针这类特殊成员),ARM64汇编会拆分成员到寄存器传值。比如你提到的Rectangle结构体(4个float,总大小16字节,成员都是简单浮点类型)就属于这种情况。
  • 若复合类型总大小 > 16字节,或者包含无法拆分传递的成员(比如嵌套结构体导致总大小超标、位域组合无法匹配寄存器宽度、变长数组等),则会传递结构体的地址——要么函数声明里参数就是指针类型,要么编译器隐式将结构体参数转为指针传递。

问题2:AArch64过程调用标准是否明确了该传参规则?

是的,AArch64的过程调用标准(Procedure Call Standard, PCS) 对复合类型的传递规则有明确规定:

  • 标准将复合类型(结构体、联合体这类聚合类型)的传递分为两种场景:
    • 当复合类型大小不超过16字节,且可分解为若干适配寄存器的基本类型(成员能对应通用寄存器X0-X7或浮点寄存器D0-D7的宽度),则将成员依次放入对应寄存器传递,也就是拆分传值的方式。
    • 当复合类型大小超过16字节,或无法分解为可寄存器传递的基本类型组合时,调用方需在栈上分配结构体空间,然后将指向该空间的指针作为参数传递给被调用函数。

内容的提问来源于stack exchange,提问作者stanle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:05:17