9.3 调用约定与参数传递
调用约定(calling convention)是调用方与被调方之间的 ABI 契约。它不是“可选风格”,而是可执行正确性的底线。
它回答的问题包括:
- 参数先放哪些寄存器,何时落栈
- 返回值放哪里
- 哪些寄存器由调用者保存,哪些由被调者保存
- 调用前栈必须满足什么对齐规则
只要任意一方违约,代码可能通过编译却在运行时读错参数或直接崩溃。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
按值与按引用:语义先于实现
参数传递先是语言语义,再落到机器级实现。
- 按值:被调方(callee)修改的是副本
- 按引用/地址:被调方修改可反映到调用方(caller)可见状态
这不是“性能小差别”,而是程序行为边界。编译器必须从语义分析一路保持到后端下沉(lowering)。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
参数超出寄存器数量时会怎样
大多数 ABI 会给参数寄存器一个固定上限。超出的参数放到调用栈区域。这是正常机制,不是编译错误。
这会影响:
- 调用点代码生成
- 可变参数函数处理
- 调试定位与跨语言一致性
边界例子
同一个 add(a,b) 签名,若一侧按 SysV x64 传,另一侧按 Win64 取,程序可能“看起来能跑”,但值全错。这就是 ABI 级缺陷(bug)的典型形态。
正在加载概念检查...