【问题标题】:Swift - constant properties (e.g. strings) computed var vs let, any advantage?Swift - 常量属性(例如字符串)计算 var vs let,有什么优势吗?
【发布时间】:2017-08-15 18:49:18
【问题描述】:

将常量(例如字符串)与类(例如视图控制器)关联是很常见的。

将这些常量写成已计算vars 与常量lets 相比有什么计算优势吗? (是的,实际上这是过度设计,但我仍然很好奇。)

例如:

let myConstant = "myConstant"

对比:

var myConstant: String {
    "myConstant"
}

我的想法是,只要它所属的类存在,前者就存储在内存中,而后者每次都计算,因此不会占用太多额外的内存。

现在,如果常量是不经常访问的东西(例如,在视图加载时只设置标签的文本一次),在我看来这样做可能会有一些优势,但是我不确定实际上是否没有任何区别或区别可以忽略不计。

我猜这可能属于过早优化的范畴,但如果其中一个或另一个是更好的做法,不妨使用它,因为它非常简单并且可以在项目中的任何地方使用。

我能看到的唯一缺点是额外的代码行和额外的字符。

【问题讨论】:

  • 对于您过早的优化点,使用最简洁和最具表现力的语法,直到您有证据表明这是一个需要进一步优化的问题。我建议let。
  • 有很多用例,您的常量可以是特定于目标的或特定于协议实现的。在这种情况下,这是一种设计优势。
  • 但是函数确实会占用内存空间,虽然不是很多(虽然可能取决于函数的长度)。这可能会消除这里任何所谓的内存优势。但可能还有其他优势。
  • 恕我直言,计算属性使用的内存将始终大于常量。原因很简单,您的符号表中可能会有字符串myConstant,因此可以将常量转换为指向该字符串地址的指针,而计算的 var 可能会作为函数分配到堆栈上然后返回指向符号表中字符串的指针。可能这会产生(真的)很小的差异,我假设当您对同一地址进行大量访问时,编译器会对其进行优化,就像编译器对集合所做的那样。
  • @Rob 是的,这只是一个观点,我不确定我在说什么,我只是根据计算机编程的常识发表评论。我认为分析它并不能真正告诉我们真相,除非你有汇编生成的代码供我们讨论。唯一确定的方法是查看 Swift 编译器的源代码 rr 询问 Chris Lattner 或 Swift 创建的任何其他高级成员 :)

标签: swift


【解决方案1】:

恕我直言,计算属性使用的内存将始终大于 let 常量使用的内存。

原因很简单,你的符号表中可能会有字符串myConstant,所以这个常量可以被翻译成一个指向这个字符串地址的指针,而计算出来的变量可能会分配在stack 作为一个函数,然后它会返回指向符号表中字符串的指针。

这可能会产生(非常)小的差异,我假设编译器会在您对同一地址进行大量访问时对其进行优化,就像编译器对集合所做的那样。

我没有任何文档来验证它,但我认为在使用常量常量或计算属性 var 时可视化和了解一些情况是合理的。

【讨论】:

  • 如果 computedProperty 不是 String 并且实际上是一个更大的构造(例如 UIColor?)怎么办?
  • 我认为“什么”并不重要。编译器可以在符号表上分配任何东西。我不知道swiftc 编译器是否做到了,但我相信这是可能的。想象一下将它转换为 C,你可以简单地拥有一个 (void*) 指针,然后做你想做的事。而且,回到这个问题,“返回的值”在这两种情况下都是相同的,但是计算属性具有作为函数的权重,具有你的优点和缺点,我认为其中一个是它在以下方面更大记忆。你怎么看?
猜你喜欢
  • 2019-03-20
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2014-11-16
  • 2018-06-11
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多