15-String与Array
2021-08-09 本文已影响0人
SwordDevil
关于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")
- ASCII码表:https://www.ascii-code.com/
从编码到启动App
dyld_stud_binder
- 符号的延迟绑定通过dyld_stud_binder完成
- jmpq *0xb31(%rip)格式的汇编指令
占用6个字节