簡體   English   中英

C中速度和空間消耗方面的靜態與全局

[英]Static vs global in terms of speed and space consumption in C

我想知道靜態變量和全局變量在訪問速度空間消耗方面的區別。 (如果你想了解我的平台:Windows上的gcc編譯器。(我在Windows上使用Cygwin和Triton IDE進行ARM7嵌入式編程.Triton在Java平台上帶有gcc編譯器,可以在Windows上運行。))

(顯然我從這個問題的文件和功能范圍方面知道)

編輯:好的,給我一個任何微控制器/處理器環境的答案。

空間沒有區別,它們的數量相同。

但速度存在差異:靜態更快。

當然,對變量的內存訪問是針對全局的,也是靜態的。 但是當你有靜態時,編譯器可以進行優化。 當它編譯模塊時,它知道對模塊外部的函數沒有函數調用可以改變靜態變量。 因此它確切地知道發生了什么,並且可以例如將其保存在函數調用的寄存器中。 當它是全局的並且您從另一個模塊調用函數時,編譯器無法知道它的作用。 因此,他必須假設函數訪問變量並對其進行更改,從而導致存儲和重新加載。

使用gcc,您可以同時傳遞所有.c源代碼,因此它還可以查看函數調用不同模塊中的函數時會發生什么。 為了使它工作,你必須立即傳遞所有.c文件-combine-fwhole-program -fwhole-program使所有全局變量都是靜態的(不是模塊靜態,而是編譯單元靜態,即所有給定的.c文件在一起)。 -combine進行模塊間分析。

空間消耗:基本沒什么區別。 唯一一次出現空間問題的是,如果你設法獲得隱藏在N個目標文件中的同一塊靜態數據,那么你得到的乘法因子為N,如果它只是一個全局的那么你可能只有一個副本數據的。 但是,這是一個錯誤的設計問題。 信息隱藏很好 - 除非不應隱藏信息。

訪問速度:沒有區別。

這很難猜測或估計。 這可能需要一些時間,但我會制作一個示例項目並測試速度。 使用循環測試訪問速度和空間。 使用該架構的仿真器測試示例項目。

我希望任何差異都來自打包(用於空間)和緩存(用於速度)問題。 這些也可能來自其他任何事情。

空間方面你所描述的env 沒有區別 靜態或全局var消耗的內存量相同。

出於速度考慮( 但不是良好實踐 ),如果需要訪問一個文件外的var ,則可能更喜歡全局變量 (ref使用external char my_global_char_placed_else_where;

為了更好的練習,您可以使用get / set函數,但速度較慢。 那么你可以使用宏來獲取/設置一個全局的var來隱藏var實際上是全局的代碼的讀者,但這有點像欺騙。 但它可以使代碼更具可讀性。

如果比較在函數中隱藏var,那么與將其放在函數外部相比沒有區別,並且更多函數可以訪問var。

我自己使用MSP430,ARM7(僅用於測試)和AVR32微處理器進行開發

喬納森所說的並不完全正確。 靜態和全局變量都將(必須)保存在ZI(或RW數據)區域中。 編譯器不能嚴格地將它“保留”在寄存器上 - 它可能做的是將值加載到寄存器中,將該寄存器用於所有操作而不是保存該值 - 這是編譯器特定的優化。 即使在那時,也沒有理由為什么編譯器也不會對全局變量這樣做:除非當然你使它變得不穩定。 但是,從技術上講,你也可以制作一個靜態變量volatile,所以再沒有區別。

編輯:哦是的 - 空間:沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM