首页 > 解决方案 > 为什么参数的函数大小增加到字大小?

问题描述

我阅读了 i386 和 AMD64 的 System V ABI。他们说参数必须四舍五入到字长的倍数。我不明白为什么。

这是情况。如果您将 4 个 char 参数传递给 i386 架构上的函数,它将占用 16 个字节(每个 char 参数 4 个字节)。只为所有 4 个参数分配 4 个字节不是更有效吗?就像它应该与局部变量一样?

对齐不是答案。因为在这两种情况下,16 字节堆栈对齐可能需要 4-12 字节填充。

标签: clinuxassemblyx86abi

解决方案


是不是更有效率...

您总是必须说出您想要优化的内容:

  • 执行速度快
  • 小程序大小
  • 更少的堆栈使用
  • 更简单的编译器
  • ...

如果您想优化更少的堆栈使用,将字节传递给函数确实会更有效。

但是,通常您希望针对快速执行速度或较小的程序大小进行优化。

与现代编译器(mov堆栈的参数)不同,大多数 1990 年代编写的编译器都知道push堆栈的参数。如果编译器使用push操作,则将字节放入堆栈会相当复杂——它会使程序变慢且变长。

(请注意,我从未见过pop对参数进行操作。)


推荐阅读