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
相关产品推荐
相关产品推荐

