【发布时间】: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