程式優化之儲存器別名使用

2021-09-02 15:43:28 字數 993 閱讀 2241

說明:本文示例摘自《深入理解計算機系統》第五章----優化程式效能。

在程式優化時,對於這樣一種現象不得不注意,即儲存器別名使用。

那麼什麼是儲存器別名使用呢?

簡單來說,就是「兩個指標可能同時指向同乙個儲存位址的情況」。

示例為證,考慮下面的**序列:

x = 1000;

y = 3000;

*q = y;

*p = x;

t1 = *q;

最終t1是多少呢?可能很多人會不假思索就回答3000,然而事實上它是完全有可能等於1000的,這種情況取決於指標p和q是否指向同乙個位址,即p是否等於q。

再來看另乙個例子:

void twiddle1(int *xp, int *yp)

void twiddle2(int *xp, int *yp)

乍一看,這兩個函式似乎相同,其實不然,同樣的道理,這樣認為的人還是忽視了儲存器別名使用的情況,但xp與yp都指向同一片記憶體時,差異就顯示出來了,前者中xp的值會增加4倍,而後者卻只增加3倍!

這樣的例子還有很多,比如遇到全域性變數時,如下例:

int f();

int func1()

int func2()

此時又如何呢?它們一定會返回同樣的結果嗎?非也!比如出現這樣的情況:

int counter = 0;

int f()

注意此時在func1中f()呼叫了4次,最終結果為 0+1+2+3= 6, 而func2中卻只呼叫了1次,最終結果為4*0=0!!!

很神奇,不是嗎?!所以在優化程式時,知道該注意什麼了吧?

儲存器別名使用!請深深將其烙印在你腦海中!

儲存器層次結構 基於儲存器的程式優化

乙個編寫良好的電腦程式常常具有良好的區域性性,它們傾向於引用鄰近於其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。區域性性通常有兩種不同的形式 下面來看個區域性性的 示例 變數sum在每此迴圈中被引用一次,因此具有良好的時間區域性性。變數v的元素被順序讀取,具有良好的空間區域性性。像這種...

mysql之優化 儲存引擎

1.2 myisam 與 innodb 主要區別 1.3 如何選擇mysql的儲存引擎 目前廣泛使用的是myisam和innodb兩種引擎 1.1.1 myisam myisam引擎是mysql 5.1及之前版本的預設引擎,它的特點是 1.1.2 innodb innodb在mysql 5.5後成為...

MySQL 儲存程式之儲存過程

1.儲存引擎簡介是mysql的核心,一組軟體包括快取軟體,語法語義分析,解析的軟體等,不同的儲存引擎提供不同的儲存機制,索引技巧,鎖定水平等功能。可以根據不同的功能來設定不同的儲存引擎。innodb 事務性資料庫的首選,執行安全性資料庫,行鎖定和外來鍵。顯示支援的儲存引擎 show engines ...