在C中定义结构时,有关于填充的注意事项,如果结构大小是一个问题,则通常重新排列值以避免填充。 (参见:Structure padding and packing)
我的问题是:
相同的(或类似)规则是否适用于函数参数? ...在安排参数以避免参数填充字节方面有什么好处吗?
假设这不是inline
(无关紧要),或static
函数,编译器可以重新排列参数。
接受现实世界可衡量的改善可能很小。
...实际上,如果函数调用开销是一个问题,可能值得内联函数。尽管如此,内联并不总是一个选项(例如库或函数指针)。
答案 0 :(得分:4)
如果参数小到足以在寄存器中传递,那么大小就不重要了。
通常答案是否定的,因为编译器在将堆栈传递给函数时经常加宽参数。例如:
因此,将一个和两个字节的参数组合在一起并不需要付费,因为参数将在寄存器中传递,或者编译器可能会将它们视为长度为四个或八个字节。
答案 1 :(得分:3)
如何将参数传递给函数因架构而异,因此不可能提供任何明确的答案。但是,对于大多数现代体系结构,前几个参数是在寄存器中传递的,而不是在堆栈中传递,并且参数的对齐方式很少,因为窄参数不会复用到单个寄存器中。