乙個小的程式設計技巧,你知道嗎?

2021-06-04 15:44:18 字數 1007 閱讀 7690

今天看linux檔案系統的**,有乙個小地方引起了我的注意。記在這裡,跟大家分享下。

大體上是這樣子的(示例**如下)。乙個函式接受乙個const char*引數,然後在函式體內又分配了乙個區域性的const char *指標,並

將剛才傳入的引數付給它,然後依次去訪問(準確的講是讀取)其指向的字串中的每個字元。當時我就懷疑為什麼還要申請乙個區域性變數呢?這不是更加浪費記憶體麼?直接用傳入的實參不是可以達到同樣的目的麼?

示例**:

void foo(const char *str)

................

但後來一想,覺得這樣可能更方便編譯器去做優化(因為採用區域性變數,其實是給編譯器的一種暗示,讓他把該變數放到暫存器中去)。推測歸推測,還是得驗證一下。開啟vi,寫測試**,gcc編譯,並用objdump -d 檢視反彙編,定位到函式,發現果然如我所料。

在不採用任何優化選項的情況下:

1:如果不使用temp變數,如下面所示,你會發現編譯器生成的**中,每次迴圈會把ebp+0x10位址處的內容加1,然後取其內容並用間接定址。

void foo(const char *str)

................

2:如果使用temp變數,則編譯器會把temp變數優化暫存器中,且每次迴圈都會只增加暫存器中的值並按照暫存器間接定址來訪問每個字元。

可見,使用區域性變數,確實有助於編譯器進行優化。

不過,我們也不能低估了我們編譯器的能力。現在的編譯器跟以前相比,智慧型了很多,能夠做很多優化。比如還是上面的例子,如果不使用temp變數,但是只要開啟gcc的o2優化選項,編譯器便會自動的將變數優化到暫存器中去。

總結一下:此處雖然用-o2也可以達優化的效果,但是如果程式稍微大起來,編譯的時間消耗還是很「可觀」的。本文提到的這個問題雖然看似很小,甚至有人可能會覺得不可一提,但我覺得任何乙個嚴肅的程式設計師應該都不會一笑了之。這裡體現了計算機體系結構中乙個非常重要的思想——區域性性原理,沒有它,我甚至不敢想象現在的計算機會是什麼樣子。好了,再扯就遠了,到此為止,希望本文對大家有點幫助。

Mac使用小技巧,這些技巧你都知道嗎?

今年蘋果公司同樣發布了mac電腦新品,不知道有沒有小夥伴已經入手了?可能有很多mac新使用者不太熟悉mac os系統的操作方法,尤其是不怎麼熟悉mac快捷鍵,今天給大家講一講mac小技巧,早晚都會用到哦!方法一 command shift delete 同時按住command shift delet...

不起眼的幾個Ecxel技巧,你知道嗎?

excel是我們很多人都會使用的到的一種工具,其實在excel中有很多是我們不知道的技巧,大家知道嗎?總結幾種不常見的技巧分享給大家。技巧一 一鍵生成臨時選單 不知道大家平時在excel中處理資料的時候,會不會使用臨時選單,其實使用 生成臨時選單 可以完成輸入資料。臨時選單的生成並不難,直接按住 a...

親愛的,你知道嗎?

親愛的,莫怪我,我實在太累了,親愛的,莫怪我,因為我覺得無法學會自私,親愛的,莫怪我,因為我覺得自己心裡太小,小的只能容下我愛你三個字,無法容下任何,因此我把自己丟了,只剩下陪伴你的軀殼,親愛的,因為我喪失了靈魂,所以在你面前如此狼狽,親愛的,因為我自己無法面對現實,所以我哭泣的近似瘋了,親愛的,因...