【问题标题】:Is mutable String stored in heap and immutable stored in stack可变字符串存储在堆中,不可变存储在堆栈中
【发布时间】:2017-11-16 21:53:39
【问题描述】:

我阅读了很多文章和文档,但仍然无法完全理解不同数据类型在内存中的存储位置。

你能解释一下内存可变字符串或任何其他可变类型,例如var string: String 已存储。

不可变字符串 或任何其他不可变类型,例如let string: String 被存储了吗?

你能回答一下 Swift 和 Objective-C 的问题吗?

【问题讨论】:

  • 为什么重要?在 Obj-C 中,如果我们谈论的是文字,它们可以存储在静态内存(既不是堆栈也不是堆)中。斯威夫特将是相似的。大多数时候将使用堆。堆栈可能是可能的,但仅作为对不可变字符串的优化。在 Swift 中,实际的 String 实例可以放在堆栈上,但它仍然会引用堆。你不知道你想要多复杂的答案。
  • 你可能想先做一点谷歌搜索:stackoverflow.com/questions/27441456/…
  • Dominik,我已经阅读了那个答案,但这是非常常见的答案,例如值类型存储在堆栈中,引用类型存储在堆中(但据我了解,这并不完全正确)。
  • Sulthan,我想要最复杂的答案,我想深入了解它。由于 CTO 的第二个面试阶段,我需要理解这个概念(甚至不是针对初级,而是针对实习生职位)。

标签: swift heap-memory stack-memory


【解决方案1】:

编译器,尤其是低级语言的编译器需要在编译之前知道类型和大小,大小未知的类型在堆上存储为可变的,例如:

var = String::from(" String_name ")

这个字符串类型可以被变异,而var = " String_name"——它是str类型——不能被变异。因此,它存储在堆栈中,与存储在堆中的不同,可以快速访问。

【讨论】:

  • 我怀疑所有不可变字符串都存储在堆栈中。其中很多应该来自代码段。
猜你喜欢
  • 2012-04-17
  • 2015-03-09
  • 2013-12-06
  • 2016-01-12
  • 2017-11-05
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多