在一个项目中,我遇到了一个大约有40个参数的函数。虽然我理解可维护性问题,但我特别好奇性能影响,包括:
是否有任何编译器优化或最佳实践(例如,使用 var、const 或指针)来缓解这些问题?见解或基准将不胜感激!
内存使用:传递许多参数是否会对堆栈或堆造成压力?
这取决于 ABI 和调用约定,以及涉及的变量类型,但通常您可以在寄存器中传递一定数量的值,其余的将在堆栈上传递。因此它效率低下,并导致堆栈峰值使用率可能不理想。
调用开销:函数调用是否变得明显变慢,尤其是对于大型结构或对象?
一般来说是这样。除非编译器可以内联该函数。
缓存性能:这会影响 CPU 缓存效率吗?
主要问题是参数从各处复制到堆栈空间中,因此数据源不太可能一起出现在缓存中(如果有的话)。
特定于平台的差异:是否某些架构(例如 ARM、x86)受影响更大?
这对于低端 ISA(如具有较小堆栈的微控制器)来说尤其麻烦。 Cortex M 或更小,如 8/16 苦味。除了性能不佳之外,您还面临堆栈溢出的风险。
是否有任何编译器优化或最佳实践(例如,使用 var、const 或指针)来缓解这些问题?见解或基准将不胜感激!
内联优化可能会消除复制所有参数的开销。因此,通过强制内联调用,您可能可以大大加快代码速度。
否则,最佳实践是 8 个左右的参数是上限,维护和性能将开始受到影响。那时,您确实需要考虑将参数放在结构/类中,并通过引用传递结构。另一个经验法则是永远不要按值传递结构/类,除非您绝对需要制作它的硬拷贝。
(此外,编译器不需要支持超过 127 个参数,但如果您已经设法获得那么多参数,我认为编译器限制是您遇到的最不重要的问题。)
总结:
这几乎在所有方面都是糟糕的。不可读、不可维护、缓慢、危险、消耗内存。