这在函数式语言中很常见,尤其是 TCO。我只是想知道除了更容易编写和跟踪之外,它是否提供了任何性能优势。如果它们只是普通参数,访问结构中的变量是否和访问它们一样快?这种方法有什么缺点吗?
3 回答
没有任何好处,因为结构是按值传递的。一个接一个地传递多个参数将从正在运行的程序中获取与分配相同数量的struct
. 此外,struct
由于填充,可能会给您带来更糟糕的结果。
即使你传递你struct
的 by 指针,你仍然需要分配你的一个新实例,struct
然后再将它传递给下一级调用。从理论上讲,您可以通过重用您在多次调用中分配一次的结构来获得一些好处,但在大多数情况下,这将是一个不值得您费心的微优化(除非您的探查器另有说明)。
甚至递归也涉及许多堆栈操作,这些操作在将参数传递给递归函数时会进一步降低性能,使其更加不规则,给开发人员造成混乱,自担风险
缺点:
如果你有__fastcall
可用的,那么递归函数可以通过寄存器传递多个参数来提高性能。可用于此的通用寄存器的数量可能因平台而异。所有额外的参数都通过堆栈传递。
堆栈托管参数很有可能在函数一开始就加载到寄存器中以进行计算。因此,每个堆栈传递的参数都需要至少一次内存访问。如果您将所有内容打包到结构中并传递其指针,那么每个成员访问也将生成至少一次对内存的访问。这里没有真正的好处
按值传递多个参数,您可以随意更改它们。使用结构成员,您可以制作临时副本以用于计算(有效地重复传递多个参数),或者编译器会将修改后的值写回结构实例所在的位置。这会产生不必要的开销。
优点:
我会将输出类型的参数打包到结构中。这只会减少参数的数量并使函数原型可以想象,因为操作具有特征的实体是人类的天性