妨礙編譯器優化的因素

2021-09-01 12:38:31 字數 632 閱讀 7260

編譯器會對程式進行優化,這種優化是安全的優化,即對於所有可能的情況,優化後的程式和未優化的程式具有相同的行為。兩種因素會妨礙編譯器對程式的優化。

1. 儲存器別名使用

void twiddle1(int *xp, int *yp)

void twiddle2(int *xp, int *yp)

函式twiddle1需要6次儲存器引用,而函式twiddle1只需要3次,函式twiddle2效率更高一點。

這兩個函式似乎具有相同的行為,但其實不是的。當指標xp和指標yp指向不同的位址時,這兩個函式具有相同的行為,但當xp指標和yp指標指向相同的位址時,兩者的行為不一樣,編譯器必須考慮這種情況,因而不能將函式twiddle2優化成函式twiddle1。

2. 函式的呼叫

int f();

int func1()

int func2()

函式func1呼叫4次函式f,而函式func2只呼叫1次函式f,因而函式func2效率更高。

同樣,這兩個函式似乎具有相同的行為,但其實不是的。當函式f會改變一些全域性引數時,函式func1會改變4次,而函式func2只改變1次。因而也不能將函式func1優化成函式func2。

妨礙優化的因素

今天在看 深入理解計算機系統 時看到了效能優化,認識到了之前從未考慮過的問題。妨礙優化的因素 1.計算依賴的指標p和q 是否指向儲存器中同乙個位置 2.函式呼叫 舉例說明 1 void twiddle1 int xp,int yp void twiddle2 int xp,int yp 乍一看,這兩...

編譯器優化

常量摺疊 a 1 2 由於結果可預見,編譯器直接生成a 3 常量傳播a 1 若後續 沒有更改a,則編譯器將a直接用其值1代替 減少變數 對於x和y的比較,可以轉換成if i j x i2 y j 2 if x y 複寫傳播 類似於常量長傳,不過傳播的是變數 若後續 未修改a的值,則編譯器用m代替a ...

編譯器優化 乘法優化

由這個想到的 31乘以某個數能不能寫成這個數乘以2的次冪 再減去這個數。用數學語言表達一下就是 設這個數為x 31 x x 2 n x 這個等式是否存在,如果存在,求n的值 那我們計算一下,31 2 n 1 得2 n 32 得n 5 也就是說存在那麼乙個n使得,31乘以某個數的結果等於這個數乘以2的...