熟悉 C++,java,VB 等编程语言的朋友都知道 String(字符串), 它是编程语言中表示文本的数据类型, 字符串由若干字符组成的, 是所有编程语? 中? 常重要的成员. 可能很多朋友平时只是使用它, 没有仔细研究其中的奥秘. 其实, 字符串还是有很多值得我们深入研究的地方.
?, 思考
在 Swift 开发使? 字符串的过程中, 你是否有思考过以下问题?
1 个字符串变量占? 多少内存?
字符串 str1,str2 的底层存储有什么不同?
如果对 str1,str2 进? 拼接操作, str1,str2 的底层存储? 会发? 什么变化?
如果你能准确地回答以上问题, 那说明对 Swift 字符串的底层存储机制还是? 较了解的.
?,1 个字符串变量占? 多少内存?
? 法 1:MemoryLayout
? 先, 可以借助 Swift ? 带的 MemoryLayout 来测试? 下
? 法 2: 汇编
另外, 我们也可以借助? 个强有? 的底层分析助?- 汇编语?, 来窥探? 下 String 的底层存储实际上分析其他语法, 系统库的底层, 都可以借助汇编语?
? 如多态的原理, 泛型的原理, Array 的底层, 枚举的底层等等
另外, 不仅仅是 Swift,C,C++,OC 的底层分析, 依然可以借助汇编语?
毕竟你写的每?? 有效代码, 最终都是要转成机器指令(0 和 1)
? 机器指令是跟汇编指令?? 对应的, 每? 条机器指令都能翻译成与之对应的汇编指令
能读懂汇编指令, 就相当于能读懂机器指令, 知道 CPU 具体在? 嘛(操作了什么寄存器, 操作了哪块内存)
本教程的代码是直接跑在 Mac 的命令?(CommandLineTools)项? 上
因此展示的汇编代码是基于 X64 的 AT&T 格式汇编, 并? iOS 真机设备的 ARM 汇编其实不同种类的汇编之间有极? 的相似性, 只是有些指令的叫法不? 样
跟微软的 Visual Studio ? 样, Xcode 也内置了? 常? 便的反汇编功能, 可以轻松查看每? 句代码对应的汇编指令, 打开反汇编界? 的步骤如下
在某?? 需要调试的代码打上断点(反汇编界? 会在断点调试状态下显示出来)
菜单: Debug>
译为汇编,
译为反汇编
运? 程序, 看到反汇编界?
如果你的反汇编经验??, 根据第 16,17 ? 的汇编就可以推敲出来, String 是占? 16 个字节因为它? 了 rax,rdx 寄存器存放字符串 str 的内容,? rax,rdx 都是 8 字节的
汇编的内容太多了, 因为时间和篇幅关系,? 章? 并不会对每? 句汇编指令进? 详细地讲解, 更多的是 想说明汇编的重要性.
三, 字符串的底层存储
窥探内存
此前我写了个可以窥探 Swift 变量内存的?? 具: https://github.com/CoderMJLee/Mems 现在? 它来窥探下字符串的 16 字节??, 究竟存储着什么数据
默认情况下按照 8 个字节? 组来显示内存数据
传递参数
是按照 1 个字节? 组来显示内存数据
字符 '0'~'9' 的 ASCII 值是 0x30~0x39, 认真观察最初 str1 的 16 个字节数据, 你发现了什么?
它直接将所有字符的 ASCII 值存储在 str1 的 16 字节中
最后 1 个字节 0xea 中的 0xa 就是字符的数量, 也是共 10 个字符
拼接
可以发现, 当对 str1 进? 拼接 "ABCDE" 的时候
它最终是将 "0123456789ABCDE"? 五个字符的 ASCII 值都存储在了 str1 的 16 字节中最后 1 个字节 0xef 中的 0xf 就是字符的数量, 也是共 15 个字符
可以看得出来,? 前 16 个字节已经存满了, 那如果再拼接 1 个字符呢?
可以看到, str1 ?? 存储的数据发? 了? 常? 的变化, 每? 个字符的 ASCII 值不? 了, 那?? 的 16 字节具体是什么含义呢?
所有字符 ('0'~'9','A' 到'F') 的 ASCII 值? 存到哪去了呢?
其他情况
如果? 开始初始化的时候(未拼接之前), 字符串的内容就是超过 15 个字符呢?
相信你能猜到是这个结果
这 16 个字节?? 并没有出现任何? 个字符的 ASCII 值
? 且这 16 个字节跟
还是有所区别
虽然它们的字符串内容都是 "0123456789ABCDEF" 如果对 str2 进? 拼接操作
不难发现: 这时 str2 的 16 字节? 发? 了变化, 跟
如何解决上述疑问?
是有点相似的
上述的种种疑问, 光看打印出来的内存数据是? 法解决的, 但是都可以利?[!!! 汇编!!!] 来解 决, 分析汇编指令,?? 就得出结论, 因为? 章的篇幅有限, 平时? 作也? 较忙, 我把上述问题的详细 剖析过程录制成了? 达 2 个多? 时的视频, 有兴趣的朋友可以? 1.5~2 倍速度观看
链 接 : https://pan.baidu.com/s/1AkS3K1ZKP8zyxhlhLRaBkA 提取码: kzrk
视频对于没有汇编基础的朋友来说, 可能会有点难度, 最好挑? 个头脑清醒的时间去观看
看完视频后, 希望? 家能够确切地感受到汇编语? 的重要性, 不要永远只停留在编写? 级语? 代 码, 沉迷于语法糖的层?
四, 最后
我们做的这么多, 当然不仅仅是为了窥探字符串的底层. 同数据结构与算法一样, 汇编绝对是助你程序生涯更进一步的必备良方. 不仅如此, 掌握这些能力, 你还能玩转软件破解, 外挂, 这是我此前?[汇编 \ C++] 编写的? 个外挂: https://github.com/CoderMJLee/SeemygoPVZCheat er
在编程领域, 字符串只是如同茫茫宇宙中的一颗行星, 渺小而又伟大. 等待我们发掘探索的东西还有很多. 在未来, 互联网还有更多领域需要编程完成. 时代进步, 软件也日新月异的发展, 不学习就等于倒退, 就会被时代淘汰. 对程序员??, 唯有不断的探索学习更多技术, 才能在这? 领域中纵横遨游.
如果你想提升自己的能力, 升职加薪, 突破瓶颈, 那一定要学习更多有关汇编及数据结构与算法等相关信息. 如果想要深入了解, 欢迎 ******, 这里不仅有与编程界大牛面对面的机会, 更有? 数免费编程技巧和技术提升秘籍, 我们期待与您共同进步.
来源: http://www.bubuko.com/infodetail-3281930.html