Swift iOS-类对象类型是否比“类”消耗更多内存;原始的;类型?

Swift iOS-类对象类型是否比“类”消耗更多内存;原始的;类型?,swift,class,memory,struct,primitive,Swift,Class,Memory,Struct,Primitive,我知道Swift原语并不存在,但这是我能想到的最好的名字 几周前我参加了一次会议,演讲者说Switch语句比If-Else语句消耗的内存稍多。我不知道2之间的内存消耗有什么不同,如果我考虑过的话,我会想到相反的结果。无论如何,这让我开始思考我的代码 我将数据从一个vc发送到另一个vc,我可以用两种不同的方式来完成 我可以将两个变量的值从ClassA发送到ClassB 我可以创建一个类或结构模型,它具有与属性相同的2个变量,然后将模型从ClassA传递到ClassB 第一个例子: ClassA:U

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

几周前我参加了一次会议,演讲者说Switch语句比If-Else语句消耗的内存稍多。我不知道2之间的内存消耗有什么不同,如果我考虑过的话,我会想到相反的结果。无论如何,这让我开始思考我的代码

我将数据从一个vc发送到另一个vc,我可以用两种不同的方式来完成

  • 我可以将两个变量的值从ClassA发送到ClassB

  • 我可以创建一个类或结构模型,它具有与属性相同的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个不同的内存地址或共享同一个内存地址


    第一个例子或第二个例子会消耗更多的内存吗?

    内存使用应该是相似的,即使有微小的差异,除非您创建了数百万个实例,否则这并不重要


    我更喜欢第二个示例,因为相关字段(firstName、lastName)是封装的。这允许您向Person添加方法,否则这些方法将驻留在您的视图控制器代码中,从而导致god类并降低代码的可测试性。

    内存使用应该是相似的,即使有微小的差异,除非您创建了数百万个实例,否则这并不重要

    我更喜欢第二个示例,因为相关字段(firstName、lastName)是封装的。这允许您向Person添加方法,否则这些方法将驻留在视图控制器代码中,从而导致god类并降低代码的可测试性。

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

    这两个字段的开销通常不是很高。当然,如果你正在制造大量(100000)的小物体,那么惩罚就加起来了。如果您的对象只包含一个机器字的真实数据,但有两个字的开销,那么您只能从内存中获得33%的利用率。更大的问题是对象是在堆上分配的,这是一个昂贵的过程。此外,创建和销毁对对象的引用需要同步修改对象引用计数

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

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

    如果您需要反复处理名字和姓氏对,请务必创建一个存储名字和姓氏的
    Person
    struct。这就是类型的意义所在。将您从位和字节提升到更高、更简单的层次来思考代码

    我强烈建议您检查一下,一个伟大的谈话由

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

    这两个字段的开销通常不是很高。当然,如果你正在制造大量(100000)的小物体,那么惩罚就加起来了。如果您的对象只包含一个机器字的真实数据,但有两个字的开销,那么您只能从内存中获得33%的利用率。更大的问题是对象是在堆上分配的,这是一个昂贵的过程。此外,创建和销毁对对象的引用需要同步修改对象引用计数

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

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

    如果您需要反复处理名字和姓氏对,请务必创建一个存储f的
    Person
    struct