美文网首页
String Array

String Array

作者: 纳兰沫 | 来源:发表于2019-08-29 14:44 被阅读0次
    WeChatf640ae8643cf8aad3b9f31d107a45cec.png
    1.png
    字符串最少16个字节
    
    var str2 = "0123456789ABCDEFG"
    

    rdx rax 放函数返回值

    rdi 存放着字符串的真实地址
    rsi 存放着字符串的长度0x10
    rdi rsi 作为函数的参数传入  call String.init
    rdx 存放的是字符串的真是地址 + 0x7fffffffffffffe0
    0x7fff674ba205 <+37>:  cmpq   $0xf, %rsi 跟15个字节进行比较 是否比较小 应该怎么存储字符串
    0x7fff674ba22b <+75>:  movabsq $0x7fffffffffffffe0, %rdx ; imm = 0x7FFFFFFFFFFFFFE0   0x7fffffffffffffe0 放入rdx
    0x7fff674ba235 <+85>:  addq   %rdx, %rdi  存放的是字符串的真是地址 + 0x7fffffffffffffe0
    -  0x100000f67 <+55>: movq   %rdx, 0xf2(%rip)          ; swiftTest.str2 : Swift.String + 8     rdx里面存放的是字符串的后8个字节
    也就是 rdx = 真实地址 + 0x7FFFFFFFFFFFFFE0
    

    如果字符串长度大于15个字节 那么它的16个字节的后8个字节是存放的真实地址 + 0x7FFFFFFFFFFFFFE0 也就是跳过前面的32个字节 就是字符串的真实地址(存放堆空间的一些描述信息)
    前8个字节的后面2个字节是标志位 表示字符串的长度
    malloc返回的是堆空间的地址值
    bt 函数调用栈

    1.字符串长度小于等于15个字节的话 字符串内容直接存放在变量的内存中
    2.字符串长度大于15个字节 字符串内容放在_text.cstring中(常量区)
      字符串的地址值信息存放在变量的后8个字节中
    3.不管字符串的长度大小 当append之后的长度大于15个字节的话  就会开辟堆空间来存放 堆空间前面的32个字节是存放
    相关信息 后面的字节是存放字符串内容
    

    常量区是程序编译的时候就确定的 在运行过程中是无法改变的

    从编译到启动

    从编译到启动过程.png

    Mach-O 和 动态库不是同时载入内存的

    dyld_stub_binder

    符号的延迟绑定是通过dyld_stub_binder完成
    调用动态库的方法的地址都是假地址 通过dyld_stub_binder来找到动态库中的真实地址,而且他的绑定是只有在需要的
    时候才会绑定,只需要绑定一次 下次再使用的时候 会直接动态改为真实地址
    
    jmpq  *0xb31(%rip) 格式的汇编指令
    占用6个字节
    

    Array

    占用8个字节 存放的是堆空间的地址值
    数组中的数据存放在堆空间
    
    array内部构成.png

    当元素数量的大小是数组容量的一半的时候 就扩容
    常量区一般是存放字符串的
    String Array行为上是值类型 实际上是引用类型

    相关文章

      网友评论

          本文标题:String Array

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