Matt Godbolt's blog
15 hours ago
- 调用约定是ABI的一部分,因架构和操作系统而异,其中x86 Linux上的System V ABI被认为是最合理的。
- 在x86 Linux上,前两个参数(包括结构体)通过寄存器rdi和rsi传递,这通常允许高效地传递小型结构体。
- 对于包含多个整数类型(例如int)的结构体,编译器可能会通过额外的指令将它们打包到一个寄存器中,而对于许多参数(超过6个),则会发生栈溢出。
- 更改参数类型(例如改为char)可以避免栈溢出,如果整个结构体能放入一个寄存器,不过编译器可能会使用不同的优化技巧。
- 理解ABI有助于设计像std::string_view和std::optional这样的类型,以高效地通过值传递,利用寄存器避免栈开销。