彙編帶你深入了解String型別底層資料結構

2021-09-29 11:50:27 字數 1995 閱讀 7538

字串作為最基礎的資料型別,在程式開發中使用最為頻繁,是每乙個程式設計師必須掌握的基礎,但是又有多少程式設計師知道它的工作原理呢?

作為一名合格的程式設計師,知其然,當然也要知其所以然!

一、思考

在 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

四、最後

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解Dojo Data

譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...