美文网首页
关于 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栈内存

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

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • iOS内存相关问题小结

    1.iOS内存 IOS 内存区主要可以划分为五个区,栈区、堆区、全局变量区、常量区、代码区。 栈区:系统负责内存管...

  • iOS-归纳

    iOS内存分区,堆区 栈区等 内存管理 属性关键字、内存分区总结 iOS- 数据存储iOS开发数据库-FMDBiO...

  • java中栈内存和堆内存有什么区别

    java中栈内存和堆内存有什么区别 栈内存和堆内存的区别: 1、栈内存用来存放基本类型的变量和引用变量,堆内存用来...

  • 内存

    内存的几大区域 栈内存和堆内存 所谓的栈内存和堆内存并不是内存里面有一块区域叫栈,有一块区域叫堆.所谓的栈内存和对...

  • 变量提升

    堆内存 & 栈内存 JS中的内存一共两种:堆内存和栈内存 堆内存 作用:用来存储引用数据类型值的内存空间叫做堆内存...

  • 堆和栈

    一 java 堆内存和栈内存 java把内存分为两种:一种是堆内存,一种是栈内存 堆: 堆内存主要存储实例化对象,...

  • iOS 栈内存与堆内存

    2015-01-17 12:00 内存模型 栈区(Stack) 由编译器自动分配释放,存放函数的参数值,局部变量的...

  • 堆vs栈 基本数据类型 vs 引用数据类型

    栈 vs 堆 栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。而堆内存存储的对象类型数据对于大小...

网友评论

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

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