C函数参数,内存对齐注意事项

C函数参数,内存对齐注意事项,c,function,memory-alignment,C,Function,Memory Alignment,在C中定义结构时,需要考虑填充,如果需要考虑结构大小,通常需要重新排列值以避免填充。(见:) 我的问题是: 相同(或类似)的规则是否适用于函数参数? ... 排列参数以避免参数填充字节有什么好处吗 假设这不是一个内联(这无关紧要),或者静态函数,编译器可以在其中重新排列参数 接受现实世界中可测量的改进可能很小 。。。在实践中,如果函数调用开销是一个问题,那么将函数内联可能是值得的。然而,内联并不总是一个选项(例如库或函数指针)。参数传递给函数的方式因体系结构而异,因此不可能提供任何明确的答

在C中定义结构时,需要考虑填充,如果需要考虑结构大小,通常需要重新排列值以避免填充。(见:)

我的问题是:

相同(或类似)的规则是否适用于函数参数? ... 排列参数以避免参数填充字节有什么好处吗


  • 假设这不是一个
    内联
    (这无关紧要),或者
    静态
    函数,编译器可以在其中重新排列参数

  • 接受现实世界中可测量的改进可能很小


。。。在实践中,如果函数调用开销是一个问题,那么将函数内联可能是值得的。然而,内联并不总是一个选项(例如库或函数指针)。

参数传递给函数的方式因体系结构而异,因此不可能提供任何明确的答案。然而,对于大多数现代体系结构来说,前几个参数是在寄存器中传递的,而不是在堆栈上,参数如何对齐也无关紧要,因为窄参数不会多路复用到单个寄存器中。

如果参数小到可以在寄存器中传递,那么大小就无关紧要了

通常答案是否定的,因为编译器在堆栈上传递参数给函数时,通常会扩大参数。例如:

  • Windows XC++在X86平台上扩展到32位。李>
  • 在Mac OS X上,IA-32呼叫对流将扩展到,而在x86-64上,呼叫约定将扩展到
  • 根据Linux x86-64调用约定,它与Mac OS X相同
  • 指定加宽到4字节

因此,将一个字节和两个字节的参数组合在一起并不划算,因为要么参数将在寄存器中传递,要么编译器可能会将它们视为四个或八个字节的长度。

请注意,该标准提到了结构中的填充,因为它们形成了可以按值复制的对象,检查为连续的内存块等。它不会提到任何类似的参数列表,因为它们不形成单个值,并且根本没有明确要求它们是连续的。因此,您的答案将由实现定义。我认为答案是否定的,这无关紧要。原因是参数将被移动到
%esp
/
%rsp
的偏移量中,因此它们的大小在以后被
%ebp
/
%rbp
的偏移量引用时并不重要。不过,我会给汇编向导留下一个更完整的答案