分配绩效
在 Swift 中,使用自动引用计数自动完成内存管理。 (请参阅内存管理 )分配是在内存中为对象保留一个点的过程,在 Swift 中,理解这样做的性能需要对堆和堆栈有所了解。堆是大多数对象放置的内存位置,你可以将其视为存储棚。另一方面,堆栈是导致当前执行的函数调用堆栈。 (因此,堆栈跟踪是调用堆栈上函数的一种打印输出。)
从堆栈中分配和解除分配是非常有效的操作,但是相比之下,堆分配是昂贵的。在设计性能时,你应该牢记这一点。
类别:
class MyClass {
let myProperty: String
}
Swift 中的类是引用类型,因此会发生一些事情。首先,将实际对象分配到堆上。然后,必须将对该对象的任何引用添加到堆栈中。这使得类成为分配的更昂贵的对象。
结构:
struct MyStruct {
let myProperty: Int
}
因为结构是值类型,因此在传递时被复制,它们被分配在堆栈上。这使得结构比类更有效,但是,如果你确实需要一个身份和/或引用语义的概念,结构就无法为你提供这些东西。
关于具有字符串的结构和类的属性的警告
虽然结构通常比类更干净,但是应该注意具有类属性的结构:
struct MyStruct {
let myProperty: MyClass
}
在这里,由于引用计数和其他因素,性能现在更类似于一个类。此外,如果 struct 中的多个属性是一个类,那么性能影响可能比结构是一个类而更负面。
此外,虽然字符串是结构,但它们在内部将它们的字符存储在堆上,因此比大多数结构更昂贵。