string(字串),是程式語言中表示文字的資料型別。接觸程式設計的你一定每天都會見到。那看似渺小的string(字串),裡面到底還隱藏著多少的秘密?大家平時天天使用的東西,你真的了解它嗎?可能平時很多人並不會深入研究它,如果你的能力還不錯,不妨看看下面幾個問題。要是對他們還存在困惑,那恭喜你,你找到了你要提公升的方向。
一、思考
在 swift 開發使用字串的過程中,你是否有思考過以下問題?
的底層儲存又會發生什麼變化?
如果你能準確地回答以上問題,那說明對 swift 字串的底層儲存機制還是比較了解的。
二、1 個字串變數占用多少記憶體?
方法 1:memorylayout
首先,可以借助 swift 自帶的
memorylayout 來測試一下
方法 2:彙編
另外,我們也可以借助乙個強有力的底層分析助手—組合語言,來窺探一下 string 的底層儲存
另外,不僅僅是 swift,c、c++、oc 的底層分析,依然可以借助組合語言
跟微軟的 visual studio 一樣,xcode 也內建了非常方便的反彙編功能,可以輕鬆檢視每一句**對應的彙編指令,開啟反彙編介面的步驟如下
debug workflow
>always show disassembly
assembly
譯為彙編,
disassembly
譯為反彙編
如果你的反彙編經驗十足,根據第 16、17
行的彙編就可以推敲出來,string 是占用 16 個位元組
三、字串的底層儲存
窺探記憶體
此前我寫了個可以窺探 swift 變數記憶體的小工具:
.one` 是按照 1 個位元組一組來顯示記憶體資料
字元 『0』~『9』 的 ascii 值是 0x30~0x39,認真觀察最初 str1 的 16 個位元組資料,你發現了什麼?
拼接
可以發現,當對 str1 進行拼接
「abcde」 的時候
"0123456789abcde"十五個字元的 ascii 值都儲存在了 str1 的
16 位元組中
可以看到,str1 裡面儲存的資料發生了非常大的變化,每乙個字元的 ascii 值不見了,
其他情況
如果一開始初始化的時候(未拼接之前),字串的內容就是超過 15 個字元呢?
相信你能猜到是這個結果
如果對 str2 進行拼接操作
不難發現:這時 str2 的 16 位元組又發生了變化,跟第27行的str1
是有點相似的
如何解決上述疑問?
提取碼:kzrk
四、最後
最後想多說一句:彙編能給你帶來的價值遠遠不止這篇文章所說的窺探字串的底層,對你的程式生涯影響絕對是終生受益的(資料結構與演算法功底也是如此),比如你還能玩轉軟體破解、遊戲外掛程式等,這是我此前用【彙編\c++】編寫的乙個遊戲外掛程式:
彙編帶你深入了解String型別底層資料結構
字串作為最基礎的資料型別,在程式開發中使用最為頻繁,是每乙個程式設計師必須掌握的基礎,但是又有多少程式設計師知道它的工作原理呢?作為一名合格的程式設計師,知其然,當然也要知其所以然!一 思考 在 swift 開發使用字串的過程中,你是否有思考過以下問題?的底層儲存又會發生什麼變化?如果你能準確地回答...
彙編中的資料定址方式
通俗的說,資料定址方式就是尋找資料的方式。在彙編中這是很重要的。英文 data addresing mode 資料定址方式有三種 一 立即數定址 舉個例子 mov eax 22h 這個22h就是立即數,也就是說立即數只能在源運算元中,而且是常量。能夠立即定址,由此得名。二 暫存器定址 把運算元放在暫...
asp中通過Connection鏈結資料庫
下面總結了asp中通過ado和oledb兩種方式鏈結資料庫的幾種方式 2.鏈結sqlserver資料庫 set sml server.createobject adodb.connection 建立connection物件例項 ado鏈結方式 str driver server local uid ...