美文网首页
Swift中,Struct在栈区,Class对象分配在堆区?

Swift中,Struct在栈区,Class对象分配在堆区?

作者: righr | 来源:发表于2020-05-12 18:37 被阅读0次

学习Swift时,有各种Struct和Class的比较,不少博客,指出Struct速度快,分配在栈区,而Class分配在堆上。初听觉得,有道理。但是有一个疑问,对象是局部变量,class对象还需要底层调用底层api分配堆,是否多余了?所以写了个demo,汇编层面,一探究竟。

class 类如下:


class Person {
    
    var age: Int? = 21;
    var age1: Int? = 1;
    var age2: Int? = 2;
    var age3: Int? = 1;
    var age4: Int? = 2;
    var age5: Int? = 2;
    var age6: Int? = 2;
    
    func begin(path pathStr: String) ->Bool {
        
        let manager = FileManager.default
        let rs = manager.fileExists(atPath: pathStr)
        
        var i = 50;
        for j in 0..<100 {
            i = i + j
        }
        
        let manager2 = FileManager.default
        let rs2 = manager2.fileExists(atPath: pathStr)
        if( rs && rs2 && age! > 10 && i > 230) {
            return true;
        }
        
        return false;
    }
}

ViewController中调用代码

class ViewController: UIViewController {

     override func viewDidLoad() {
        super.viewDidLoad()
        
        let p: Person = Person()
        p.begin(path: "asdf");
        
    }
}

设置为Release模式,在 super.viewDidLoad() 代码处断点。运行,断点后,从Debug->Debug Work Flow -> Always Show Disassembly,切换到汇编模式。

1.jpg

swift_initStackObject 看名字,就知道是分配栈区的,如果还不信,可以进入这个方法看下,其实汇编也没多少,没有堆申请,只是简单的栈空间返回。在断点处打印了,返回的x0寄存器和sp栈底寄存器。一摸一样。其实这个是在Rlease模式是这样的,如果是Debug模式。是会分配在栈区的。

2.jpg

class 对象在方法中,以局部变量存在时,其实就是分配在栈区。避免堆申请,系统调用。

当class 对象以属性,存在于Controller中时,我们也看看吧。代码如下:


class ViewController: UIViewController {
    
    let p: Person = Person()
    
     override func viewDidLoad() {
        super.viewDidLoad()
        
        p.begin(path: "asdf");
        
    }
}

Person 内下断点,查看变量是如何分配的。


3.jpg

swift_allocObject 就是alloc对象的。分配完成后,返回在x0中,然后调用SwiftTableDemo.Person.init() -> SwiftTableDemo.Person 完成初始化对象。

结论: class 对象以属性存在时,需要在堆中存在的,当是局部变量时,是分配在stack中。其实Struct 也类似,局部变量存在时,存在栈区,属性存在时,存在堆区。

相关文章

  • Swift中,Struct在栈区,Class对象分配在堆区?

    学习Swift时,有各种Struct和Class的比较,不少博客,指出Struct速度快,分配在栈区,而Class...

  • 面试题二

    Swift 1、Swift中struct和class有什么区别? struct是值引用,更轻量,存放于栈区,cla...

  • Swift考察总结

    Swift 一、Swift中struct和class有什么区别? struct是值引用、更轻量,存放于栈区,cla...

  • iOS中class与struct的区别

    class:引用类型,使用isa指针指向,分配在堆中 struct:值类型,赋值传递的值,分配在栈中 class允...

  • iOS 需要注意的细节

    C语言最重要的:指针, 链表, 结构体结构体分配在栈区对象分配在堆区 1,@class 如果只需要使用类名,不需要...

  • 堆、栈、方法区的关系

    方法区存放类的元数据(Class)、堆中存放new出来的对象(Class实例)、栈中存放引用变量 栈指向堆、堆指向...

  • 掌握JVM面试专题20道题和答案Offer拿到手软

    JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(stati...

  • iOS 小经验 01

    1.指针分配在栈区,对象分配在堆区 2.除非确实必要,否则不要引入头文件;如果一定要引入,尽量使用“向前声明” @...

  • java中的变量存储地址

    堆区:只存放类对象,线程共享;方法区:又叫接静态存储区,存放class文件和静态数据,线程共享;栈区:存放方法局部...

  • swift的Struct学习-1

    Struct和Class的区别 Struct是值类型,存储于栈区,所以少量内存用结构体 Class是引用类型,存储...

网友评论

      本文标题:Swift中,Struct在栈区,Class对象分配在堆区?

      本文链接:https://www.haomeiwen.com/subject/kglinhtx.html