最好在堆栈上分配过多的内存,或者在堆上分配正确的内存?

时间:2018-12-01 15:50:04

标签: memory memory-management

我刚开始学习rust,这是我对低级语言(通常是python)的第一次适当的学习。本教程的一部分说明,字符串文字存储在堆栈中,因为它的大小是固定的(已知)。它还解释说,未初始化的字符串存储在堆上,因此其大小可以根据需要增大。

我的理解是栈比堆快得多。如果字符串的大小未知,但我知道它永远不会超过n个字节,那么在堆栈上分配最大大小而不是将其粘贴在堆上是否有意义?

这个问题的目的不是解决问题,而是帮助我理解,因此,我将感谢详细而详尽的答案!

1 个答案:

答案 0 :(得分:0)

堆栈和堆之间的性能差异是由于以下事实:堆中的对象可能会在运行时更改大小,然后必须将它们重新分配到堆中的其他位置。

现在是详细部分。假设您有一个整数i32。该数字将始终是相同的大小,因此对其进行的任何修改都将就地进行。当它超出范围时(程序中不再需要它),它将被删除,或者是一种更有效的解决方案,它将连同它所属的整个堆栈一起被删除。

现在您要创建一个字符串。因此,您可以在堆中创建它并为其赋值。然后,您对其进行修改并向其中添加一些字符。现在可以发生两件事。

  1. 字符串后有可用内存,因此分配器使用此内存来写入新部分。
  2. 在字符串之后,已经在内存中分配了一个对象,当然,您不想覆盖它。因此,分配器将寻找具有足够大小的下一个可用内存空间,以容纳新字符串并将其复制到该字符串中。然后删除旧的,释放该内存。

如您所见,在堆中要执行的操作数量比在堆栈中要多得多,因此它的性能会降低。

现在,就您而言,有一些专门用于内存保留的方法。 String::reserve()String::reserve_exact()。我建议您始终阅读Rust的文档。通常,已经有了您想要的std方法。