美文网首页
15-String与Array

15-String与Array

作者: SwordDevil | 来源:发表于2021-08-09 07:39 被阅读0次

    关于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的思考

    相关文章

      网友评论

          本文标题:15-String与Array

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