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个字节是存放
相关信息 后面的字节是存放字符串内容
常量区是程序编译的时候就确定的 在运行过程中是无法改变的
从编译到启动
从编译到启动过程.pngMach-O 和 动态库不是同时载入内存的
dyld_stub_binder
符号的延迟绑定是通过dyld_stub_binder完成
调用动态库的方法的地址都是假地址 通过dyld_stub_binder来找到动态库中的真实地址,而且他的绑定是只有在需要的
时候才会绑定,只需要绑定一次 下次再使用的时候 会直接动态改为真实地址
jmpq *0xb31(%rip) 格式的汇编指令
占用6个字节
Array
占用8个字节 存放的是堆空间的地址值
数组中的数据存放在堆空间
array内部构成.png
当元素数量的大小是数组容量的一半的时候 就扩容
常量区一般是存放字符串的
String Array行为上是值类型 实际上是引用类型
网友评论