Swift iOS - 类对象类型是否比 "Primitive"类型消耗更多内存?

标签 swift class memory struct primitive

我知道在 Swift 中不存在原语,但这是我能想到的最好的名字。

几周前我参加了一次聚会,演讲者说 Switch 语句比 If-Else 语句消耗的内存稍多。我不知道两者之间的内存消耗存在差异,如果我考虑过它,我会想到相反的情况。不管怎样,它让我开始思考我的代码。

我正在将数据从一个 vc 发送到另一个 vc,我可以通过两种不同的方式进行。

  1. 我可以将 2 个变量的值从 ClassA 发送到 ClassB

  2. 我可以创建一个具有与属性相同的 2 个变量的类或结构模型,然后将模型从 ClassA 传递到 ClassB

第一个例子:

ClassA:UIViewController{

var firstName: String?
var lastName: String?

viewDidLoad...{

    self.firstName = "Veggie"
    self.lastName = "Burger"
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "..."{

              let classB = segue.destination...
              classB.firstName = self.firstName
              classB.lastName = self.lastName
        }
}

ClassB:UIViewController{

var firstName: String?
var lastName: String?

viewDidLoad...{

     self.firstName! ... //do something with it
     self.lastName! ... //do something with it
}
}

第二个例子:

class: Person{
     firstName: String?
     lastName: String?
}


ClassA:UIViewController{

var person: Person?

viewDidLoad...{

    self.person = Person()
    self.person.firstName = "Veggie"
    self.person.lastName = "Burger"
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "..."{

              let classB = segue.destination...
              classB.person = self.person
        }
}

ClassB:UIViewController{

var person: Person?

viewDidLoad...{

     self.person.firstName! ... //do something with it
     self.person.lastName! ... //do something with it
}
}

我知道在第一个示例中我有 2 个不同的值位于 2 个不同的内存地址,但在第二个示例中我有 1 个值位于 1 个内存地址。我不确定它的属性是否也位于 2 个不同的内存地址或共享同一个。

第一个示例或第二个示例会占用更多内存吗?

最佳答案

对象(类的实例)有两个机器字的开销。一个指向元类对象(其中包含有关对象的实例变量、属性、方法等的所有各种信息),另一个指向对象的引用计数和其他预订保留数据。

这两个字段的开销通常不是很大。当然,如果您制作很多(100,000 个)小 object ,惩罚就会增加。如果你的对象只包含一个机器字的真实数据,但有 2 个字的开销,你只能从内存中获得 33% 的利用率。更大的问题是对象是在堆上分配的,这是一个昂贵的过程。此外,创建对对象的销毁引用需要同步修改对象引用计数。

结构体以内联方式存储它们的字段,结构体的实例存储在堆栈中。它们非常高效并且可由编译器高度优化。在大多数情况下,启用整个模块优化后,大多数结构在运行时甚至不存在,因为编译器能够直接处理其中的数据。事实上,它们非常高效,以至于您可能认为是“原始”(来自 Java 等语言)的所有内容实际上都是作为结构(或者可能是类似的 enum)实现的。比如Int(和(U)Int8/16/32/64),Character等都是结构体。

但重要的是,这些都不重要。在您确定性能问题之前,让不相关的因素支配您的代码是在浪费时间,而牺牲其他可能更重要的因素(可读性、可维护性、简洁性等)。

如果您需要重复处理成对的名字和姓氏,无论如何,请继续创建一个Person 结构来存储名字和姓氏。这就是类型的要点。让您从位和字节中脱颖而出,让您对代码的思考达到更高、更简单的层次。

我强烈建议您查看 Do iOS 2016 - Rob Napier, Once more, with types , @RobNapier 的精彩演讲

关于Swift iOS - 类对象类型是否比 "Primitive"类型消耗更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594285/

相关文章:

ios - Core Image 渲染缓慢

ios - 转换从 CMMotionManager() 获取的 3D 位置以在 2D CG 坐标系上设置角度

ios - Swift 4 中的视频动画

c++ - 用户替换 Malloc

android - 即使在关闭应用程序后,是否可以在 Android(内存中)中保存变量值?如果是这样,如何?

ios - RxSwift - 双向绑定(bind)以使用同一屏幕编辑和添加模型

c++ - 在类中声明对象的数组大小

c++ - 调用变量的类中的构造函数

没有显式外键关系的 Linq To SQL

mysql将索引压入内存