【问题标题】:Struct with local references vs Class with local references? Swift performance带有本地引用的结构与带有本地引用的类?迅速的表现
【发布时间】:2016-12-17 22:25:26
【问题描述】:

据我所知,如果一个结构包含多个引用作为存储的属性,分配它的成本(2*reference)比分配一个类的成本高。 局部变量的情况是否相同?

struct ViewNavigationRouter {

    private let firstViewController : UIViewController

    init(firstViewController: UIViewController) {
        self.firstViewController = firstViewController
    }

    func navigate(from: UIViewController) {

        let viewController1 : UIViewController = xxx
        let viewController2 : UIViewController = xxx
        let viewController3 : UIViewController = xxx
    }
}



class ViewNavigationRouter {

    private let firstViewController : UIViewController

    init(firstViewController: UIViewController) {
        self.firstViewController = firstViewController
    }

    func navigate(from: UIViewController) {

        let viewController1 : UIViewController = xxx
        let viewController2 : UIViewController = xxx
        let viewController3 : UIViewController = xxx
    }
}

提前致谢:)

【问题讨论】:

  • “分配成本更高”是什么意思?内存方面?你有链接到你知道的地方吗?
  • 是的,您可以观看有关它的视频:developer.apple.com/videos/play/wwdc2016/416 如果结构有引用,则它们中的每一个都分配在堆中,并且它添加了 2 个额外的单词(类型和引用计数),甚至结构在堆栈中分配
  • 似乎问题所指的部分大约在 15 分钟内,他们指出要复制内部包含 N 个引用的结构,所有这些引用都必须增加其保留计数(而如果你添加另一个对内部有 N 个引用的类的引用,则这一切都不会发生)。
  • "如果结构有引用,每个引用都分配在堆中,并添加 2 个额外的字(类型和引用计数),即使结构也分配在堆栈中"。好吧,当你分配一个新的类实例时也会发生同样的事情。这实际上并不是分配结构的效果,而是分配引用指向的对象的效果。另外,如果你复制一个结构,第二个结构的引用将指向堆上的相同对象,所以那里没有重复。

标签: ios swift performance memory


【解决方案1】:

看来,在这种情况下,结构 ViewNavigationRouter 和类 ViewNavigationRouter 中的所有成员都是 - 类的实例(firstViewController : UIViewController)。我没有看到更广泛的上下文,但这里看起来像这样。

我建议你阅读这个 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html 很多时候,特别关注部分结构和枚举是值类型,类是引用类型。

最重要的区别与复制内容标识符时发生的事情是“指向”有关。我建议您进一步阅读:

https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.htm 并查看示例。然后你会发现差异不在于内存性能,而在于 ARC 清除内存的方式。

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多