美文网首页
关于 ios 内存平移-堆vs栈内存

关于 ios 内存平移-堆vs栈内存

作者: sea777777 | 来源:发表于2020-06-18 10:57 被阅读0次
    @interface Test : NSObject
    -(void)testFunc;
    @property(assign) int tag;
    
    @end
    
    @implementation Test
    
    -(void)testFunc{
        self.tag = 10;
        NSLog(@"当前self内存  %p",&self);
    }
    @end
    
     //定义类对象,存储在0x1区
        id globalTest = [Test class];
        
        //定义栈指针,指向类对象
        void *pr = &globalTest;
        
       // 这里的调用肯定是成功的
        [(__bridge id)pr testFunc];
    

    这种调用的好处是效率高,没有通过实例的 isa 去寻找类对象,而是直接通过类对象调用了方法 提高了方法的调用效率。

    如果想提高方法调用效率,其实也可以通过内联(inline)的方式提高调用效率;

    值得注意的是,内存平移的方式,另外一个相对于alloc 的好处是:栈内存分配比堆内存分配更快

    题外话:栈的分配是连续的,而且相对于线程是独立的,不需要加锁,而堆的分配,需要先找到一块空闲内存区,再加锁,进行分配,额外浪费了很多性能

    WX20200618-105541@2x.png
    (lldb) p globalTest
    (id) $3 = 0x00000001029ff708
    (lldb) p pr
    (Test *) $4 = 0x00007ffeed204468
    (lldb) x/16xg 0x00007ffeed204468
    0x7ffeed204468: 0x00000001029ff708 0x000000000000000a
    0x7ffeed204478: 0x00007ff32e904480 0x00007fff52387421
    0x7ffeed204488: 0x0000600000dcdbc0 0x00007ffeed2044e0
    0x7ffeed204498: 0x00007fff48c82698 0x0000000000000000
    0x7ffeed2044a8: 0x0000000000000000 0x0000000000000001
    0x7ffeed2044b8: 0x0000000090800c00 0x0000000000000001
    0x7ffeed2044c8: 0x0000000050ba4401 0x0000000000000001
    0x7ffeed2044d8: 0x0000000000000010 0x00007ffeed204810
    
    

    想出内存平移的人,我想他的目的也是为了提高方法调用效率,那么提高方法调用效率,如果是swift语言,可以采用struct 或者extension 的方式,因为这两种方式都是直接派发方法,而不是oc那样消息机制,更不像class那样采用 witness table的方式来调用。效率很高

    相关文章

      网友评论

          本文标题:关于 ios 内存平移-堆vs栈内存

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