按引用传递的 Space 复杂度是多少

What is the Space Complexity of Passing by Reference

我正在阅读 this 网站以了解 space 复杂性。它提到了以下场景:

函数是用按值传递的语言编写的。因此,无论何时传递参数,都会为局部变量分配新内存。但是,您将 pointer 传递给变量,因此您是通过引用传递的。

网站说这样不会为局部变量分配new space,因为你是引用传递,所以变量已经存在于内存中,然后共享内存。

但是它不会仍然创建一个指向内存位置的指针的局部变量吗?并因此分配新内存?

是;在堆栈帧中为该调用分配了一个内存字。他们打算传达的意思是您没有为现有变量分配内存(例如,1kb 用于 1000 个字符的字符串)。形式上,这个分配是 O(1) 而不是你通过值传递得到的 O(n)

如果你不认为堆栈是进程内存的一部分,那么你有一个zero-cost这种情况下的分配。另外,请注意 O(1) space 开销 而不是 会增加任何算法的复杂性,因此理论上可以忽略。这是有效的,尽管这样做确实闻起来很奇怪。

我不太了解 space 复杂性,但引用通常在堆栈上传递。一些系统将其完全保存在寄存器中,特别是如果函数是内联的,因此没有内存分配。

还要注意寄存器、堆栈和堆在性能、安全等方面的巨大差异