15-String与Array

关于String的思考

  • 1个String变量占用多少内存?
  • 下面2个String变量,底层存储有什么不同?
// 字符串长度 <= 0xF,字符串内容直接存放在str1变量的内容中
var str1 = "0123456789"

// 字符串长度 > 0xF,字符串内容存放在__TEXT.cstring中(常量区)
// 字符串的地址值信息存放在str2变量的后8个字节中
var str2 = "0123456789ABCDEF"

/*
 占用16个字节,0的ASCII对应30 1的ASCII对应31 所以是直接将数值存储进去
 0x3736353433323130 0xea00000000003938
 0xe 用来做标识的
 a是用来存储长度的
 类似于OC的tagger pointer
 */
var str1 = "0123456789"
//var str1 = "0123456789ABCDE" // 0x3736353433323130 0xef45444342413938

/*
 如果超过16个字节
 0xd000000000000010 0x8000000100007ad0
 0xd00000000000001a 0x8000000100007ad0
 但是还是占用16个字节
 但是这2个地址变化不大 所以字符不是存储在这里
 
 汇编代码
 movabsq $0x7fffffffffffffe0, %rdx
 addq %rdx, %rdi
 
 字符串的真实地址 + 0x7fffffffffffffe0 = 0x8000000100007ad0
 字符串的真实地址 = 0x8000000100007ad0 - 0x7fffffffffffffe0 = 0x100007AF0
 
 0x100007AF0是"0123456789ABCDEF"的真实地址
 %rdi存放着字符串的真实地址
 %rsi存放的是字符串的长度0x10
 callq String.init
 %rdx存放的是 字符串的真实地址 + 0x7fffffffffffffe0
 */
var str2 = "0123456789ABCDEF" // 0xd000000000000010 0x8000000100007ad0
//var str2 = "0123456789ABCDEFFDSFSDFDSF" // 0xd00000000000001a 0x8000000100007ad0

  • 如果对String进行拼接操作,String变量的存储会发生什么变化?
// 如果字符串长度没超出0xF, 还是会保存str1变量的内存里面的
str1.append("ABCDE")
// 开辟堆空间
str1.append("F")

// 超出16个字节以后, 开辟堆空间
str2.append("G")

从编码到启动App

dyld_stud_binder

  • 符号的延迟绑定通过dyld_stud_binder完成
  • jmpq *0xb31(%rip)格式的汇编指令
    占用6个字节

关于Array的思考

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于String的思考 1个String变量占用多少内存? 下面2个String变量,底层存储有什么不同? var...
    5e4c664cb3ba阅读 2,761评论 0 0
  • 关于String的思考 1个String变量占用多少内存? 下面2个String变量,底层存储有什么不同? 如果对...
    Stago阅读 1,783评论 0 1
  • 首先定义一个字符串,如下所示: 易知str1字符串在内存中占用16个字节; 下断点,进入汇编代码: movq %r...
    YanZi_33阅读 3,398评论 0 0
  • 13.1 Objective-C消息传递(Messaging) 对于C/C++这类静态语言,调用一个方法其实就是跳...
    泰克2008阅读 6,727评论 1 6
  • 13. Hook原理介绍 13.1 Objective-C消息传递(Messaging) 对于C/C++这类静态语...
    Flonger阅读 5,327评论 0 3

友情链接更多精彩内容