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

时间:2015-05-21 02:42:34

标签: c function memory-alignment

在C中定义结构时,有关于填充的注意事项,如果结构大小是一个问题,则通常重新排列值以避免填充。 (参见:Structure padding and packing

我的问题是:

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

  • 假设这不是inline(无关紧要),或static函数,编译器可以重新排列参数。

  • 接受现实世界可衡量的改善可能很小。

...实际上,如果函数调用开销是一个问题,可能值得内联函数。尽管如此,内联并不总是一个选项(例如库或函数指针)。

2 个答案:

答案 0 :(得分:4)

如果参数小到足以在寄存器中传递,那么大小就不重要了。

通常答案是否定的,因为编译器在将堆栈传递给函数时经常加宽参数。例如:

  • Windows Visual C ++在x86平台上扩展到32位。 (link)
  • 在Mac OS X上,IA-32呼叫对流将扩展到4 bytes,而在x86-64上,呼叫约定将扩展为8 bytes
  • 根据this,Linux x86-64调用约定与Mac OS X相同。
  • ARM standard指定扩展为4个字节。

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

答案 1 :(得分:3)

如何将参数传递给函数因架构而异,因此不可能提供任何明确的答案。但是,对于大多数现代体系结构,前几个参数是在寄存器中传递的,而不是在堆栈中传递,并且参数的对齐方式很少,因为窄参数不会复用到单个寄存器中。