iOS Switch內部原理

2021-09-01 09:14:53 字數 2473 閱讀 5666

1、假設switch語句的分支比較少的時候(例如3,少於4的時候沒有意義)沒有必要使用此結構,相當於if。

2、各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。

三個及以下case

1.建立工程在main函式頁面寫下如下**:

void funa(int a)

}

2.debug -> debug overflow -> always show disassembly 調成編譯斷點模式在方法處打斷點,真機執行檢視彙編**。

switch 3個case彙編**

3.上圖基本流程如下(省略系統正常操作):

1.將引數a-1判斷a和1是否相等

2.相等則執行case**

3.不相等則將引數 a - 2再判斷 a 和 2是否相等

4.根據case遞增判斷知道default 結束

注:這和if else判斷相似乙個乙個比較,是最基本的方法。

四個case

1.輸入以下**

void funa(int a)

}

2.編譯真機執行獲得如下結果:

switch4選項以上

3.如上**析:

1.先將引數減一和減四(4位case的數量)。

2.先判斷是否為default選項(上面減四就是為了判斷是否為default的情況)。

3.在實體地址部分建立記憶體表並且將case按順序放進記憶體表中

4.獲取記憶體位址,然後根據引數減一後偏移2個單位,查詢case在表中的具體位址準確找到對應的位址記憶體並且將值賦給暫存器。

5.根據獲得的位址跳轉指定的case直接找到目標執行。

記憶體位址計算

彙編指令的用法見

1.首先獲取物理記憶體位址為0x1040ce8a8

2.根據引數傳的是3,然後減一得2(10)偏移兩個單位即1000為8位得到bc ff ff ff記憶體位址是從右往左讀的

3.將獲得的實體地址0x1040ce8a8加上計算得出的偏移位址後就等到了跳轉執行位址(即在記憶體**中確定具體記憶體位置)。

4.直接跳轉執行。

注:計算方法為將實體地址0x1040ce8a8 + 0xffffffffbc = 0x1040ce8a8 - 0x44(取反加1 補碼 詳見補碼) = 0x1040ce864計算結果跟上圖列印結果完全一致是不是很神奇?分部差異大的例子

1.輸入以下**

void funa(int a)

}

2.編譯真機執行獲得如下結果:

跳躍性switch

3.解析:

當case的判斷條件跳躍性太大,編譯器就會變為if判斷一樣採用一一比較的方式進行判斷效率是不高的。

所以在寫switch語句的時候盡量要將其判斷的case連續起來這樣即減少執行時間又節省系統記憶體

執行switch時,會生成一張跳轉表,表項數為(最大case值-最小case值+1),跳轉表是乙個陣列,陣列是一段連續的記憶體,jt陣列中包含了7個表項(陣列索引對應值),每個都是指向對應**塊的指標。

編譯器將switch值n-最小case值(100),把取值範圍移動到0至6之間,建立出乙個新的程式變數index。首先判斷index是否大於6,來判斷是否在範圍之外,如果超出直接執行default,即log_def指標對應**塊。

否則,根據索引的值直接跳轉不同位置。                  

執行if-else是逐個條件進行判斷,直到命中;與if-else語句相比,使用跳轉表的優點是執行switch語句的時間與數量無關,且讀取switch引數時只讀取一次,就可跳到對應分支;缺點是維繫了乙個連續的陣列,實際時使用空間換時間。

這邊簡單介紹下,差異小的部分編譯器會根據系統記憶體和時間之間取捨,比如4個case差值在8之間會建八個元素的表,剛才4個記憶體位,現在就是8個記憶體位,case以外的間隔預設為default。具體的時間空間問題是編譯器決定的。

libvirt內部原理

1 什麼是libvirt,它的功能有哪些?libvirt 是管理虛擬機器和其他虛擬化功能,比如儲存管理,網路管理的軟體集合。這 些軟體包括乙個api 庫 乙個daemon libvirtd 和乙個命令列工具 virsh the goal of libvirt to provide a common ...

AsyncTask內部原理

asynctask 是乙個封裝了 threadpoolexecutor 和 handler 機制的抽象類,其作用是方便開發者進行多個非同步任務時無需手動在每個執行緒中都採用 handler 機制來通知 ui 執行緒進行操作,從而簡化了多個非同步任務與 ui 執行緒的通訊的情況.我們先留下幾個問題,在...

oracle內部原理

總是以為對oracle很了解,已經使用了好多年,基本是增 刪 改 查,偶爾搞搞plsql,儲存過程等等,算是老使用者了!看到網上的大牛的理解程度,真是不堪一擊,要往這條路發展,還有好多東西要學習 國內的it技術,個人認為資料庫技術已經很牛了!其他的技術不敢下結論 color green size x...