美文网首页
NSString编译器的内存优化

NSString编译器的内存优化

作者: LPL_d5fc | 来源:发表于2020-05-11 17:23 被阅读0次

正常情况下,创建一个OC对象,即引用类型的变量,都会在堆中申请一块内存空间。

但是NSString 是一个例外,编译器对字符串进行了优化。

1.通过字面量创建的字符串是存储在常量区的,而不是堆区。

2.值相等的两个字符串占用同一份内存。

通过事例我们可以看出,str1和str2占用同一份内存。str3和str5占用一份内存。

其中str1和str2使用字面量进行创建,并且值相等,故存储在常量区,占用一份内存。

而str3通过Format方式创建的字符串,是占用堆内存的。这时再通过字面量创建str4,并让其值与str3相同,我们发现内存地址不同了,因为一个在常量区,一个在堆区。

再来比较str3与str5,经过测试,图中str5的两种创建方式,内存地址都与str3相同。可得出结论,使用Format创建的字符串存储在堆区,堆区中的字符串值如果相等,也是同样占用一份内存。

总结

1.通过字面量,或者initWithString这两种方式创建的字符串都是属于字符串常量,存储在常量区,常量区中的字符串常量如果值相等,那么占用同一份内存。

2.通过Fromat创建的字符串,是存储在堆中的,同处堆中的字符串,如果值相等,也是占用同一份内存的。

相关文章

  • NSString编译器的内存优化

    正常情况下,创建一个OC对象,即引用类型的变量,都会在堆中申请一块内存空间。 但是NSString 是一个例外,编...

  • 优化

    系统作的内存方面优化 NSString NSString的类型分为三种: __NSCFConstantString...

  • NSString内存管理

    NSString的内存优化 OC中的NSString不论是在编译时还是在运行时都做了很多的优化,并不同于普通的对象...

  • Java 内存屏障 Memory Barrier 及 volat

    Java 内存模型如下图所示: 内存屏障 Memory Barrier 处于性能优化的目的,编译器和 CPU 可能...

  • volatile 每次存取原始内存地址

    内存访问速度远不及CPU处理速度,所以编译器优化:将内存变量缓存到寄存器,但是在某些嵌入式场景中优化会出问题: 下...

  • LLVM

    一、编译器 性能优化:启动优化、界面优化、架构优化 编译型语言:OC(编译器是clang)、C(编译器可以直接执行...

  • GO内存逃逸是什么

    一、我们说内存逃逸时在说什么 问,内存逃逸是干什么的答,内存逃逸分析是编译器在编译优化时,用来决定变量应该分配在堆...

  • 多线程 无锁创建单例模式

    有两个冲突来源: 编译器优化和CPU优化 如果 实际有三个运行步骤 检查 创建内存并指向 构造 实际执行的时候23...

  • C/C++的volatile关键字应用示例

    首先必须强调volatile无法用来保证线程安全。 volatile的功能是阻止编译器优化,从而直接从内存中读写变...

  • 内存优化

    内存优化、UI优化(布局优化、会只优化)、速度优化(线程优化、网络优化)、启动优化、电量优化 内存优化 内存抖动:...

网友评论

      本文标题:NSString编译器的内存优化

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