問題
- 為什么蘋果生產(chǎn)包會自動選擇
Release環(huán)境?
1.認識slowpath 和 fastpath
objc4源碼中有很多slowpath和fastpath函數(shù),他們都是為編譯優(yōu)化而生。

image.png
宏定義如下:
#define fastpath(x) (__builtin_expect(bool(x), 1))
#define slowpath(x) (__builtin_expect(bool(x), 0))
2. 認識 __builtin_expect(EXP, N)
__builtin_expect是gcc引入的
-
作用: 允許
程序員將最有可能執(zhí)行的分支告訴編譯器。 -
函數(shù):
__builtin_expect(EXP, N)表示 EXP==N的概率很大
3. slowpath 和 fastpath
-
fastpath:
定義__builtin_expect((x),1),表示 x 的值為真的可能性更大;即執(zhí)行 if里面語句的機會更大 -
slowpath:
定義的__builtin_expect((x),0),表示 x 的值為假的可能性更大,即執(zhí)行 else里面語句的機會更大
4. 如何配置
target->BuildSettings: 搜索:optimization。
我們發(fā)現(xiàn)Optimization Level中,Release環(huán)境下,已自動選擇Fastest,Smallest[-OS]。 這就是我們問題的答案。在開發(fā)過程中,想要提高編譯速度,可將
Debug環(huán)境也選中Fastest,Smallest[-OS]模式。

image
在Fastest,Smallest[-OS]模式下,會發(fā)現(xiàn)匯編頁面展示的代碼已精簡很多
答案
Release環(huán)境下,系統(tǒng)自動選擇Fastest,Smallest[-OS]模式,完成編譯器優(yōu)化。
下一節(jié): OC底層原理五:剖析isa (卸妝后的對象)