當前位置:才華齋>計算機>C語言>

C語言初始化效率問題及關鍵字解釋

C語言 閱讀(1.72W)

C語言是一門通用計算機程式語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。本文主要介紹C語言初始化效率問題以及關鍵字解釋。

C語言初始化效率問題及關鍵字解釋
  一、初始化效率

1、在靜態變數的初始化中,我們可以把可執行程式檔案想要初始化的值放在當程式執行時變數將會使用的位置。當可執行檔案載入到記憶體時,這個已經儲存了正確初始值的位置將賦值給那個變數,完成這個任務並不需要額外的時間,也不需要額外的指令,變數將會得到正確的值、

2、自動變數當程式連結時還無法判斷自動變數的儲存位置。事實上,函式的區域性變數在函式的每次呼叫中可能佔據不同的位置。基於這個理由,自動變數沒有預設的初始值,而顯示的初始化將在程式碼塊的其實出插入一條隱式的賦值語句。

一句話總結;區域性變數的初始化與分開寫毫無區別

即什麼時候使用變數什麼時候宣告,儘量重用,不要讓他隱式初始化,浪費記憶體

static 關鍵字的修飾。

當它用於函式定義時,或用於程式碼塊之外的變數宣告時,static關鍵字用於修改識別符號的連結屬性,從external改為internal,但識別符號的儲存型別和作用域不受影響。用這種方式宣告的函式或變數只能在宣告他們的原始檔中訪問。

總結:

一下以檔案解釋

int a;

//a 變數儲存在靜態記憶體

特點:

在程式執行之前建立

可以被其他的C檔案訪問以及它的下方函式使用

初始化值為0

=================

static int a;

特點:在程式執行之前存在

靜態記憶體儲存

不能被其他檔案訪問

================

程式碼塊中的變數

static int a ;

靜態變數

與int a ;(區域性變數)

的區別是:

一個儲存在靜態記憶體 也就是普通記憶體

另一個是區域性變數,也就是執行時堆疊

函式上新增static的話:

不能被其他的檔案訪問該函式

幾個關鍵字的處理

static 靜態記憶體

auto 執行時堆疊

register 硬體暫存器

external 引用外部檔案變數函式

internal 引用內部檔案變數函式

=======================

關於程式碼塊變數被static修飾

保證該函式多次呼叫時,我們為了防止該變數不變

進行的處理比如我們進行了多次的呼叫

  二、關鍵字解釋

變數的儲存型別(storage class )是指儲存變數值的記憶體型別。變數的儲存型別決定變數何時建立、何時銷燬以及它的值將保持多久。有三個地方可以用於儲存變數:普通記憶體、執行時堆疊、硬體暫存器。在這三個地方儲存的變數具有不同的特性。

變數的預設儲存型別取決於它的宣告位置。凡是在任何程式碼塊之外宣告的變數總是儲存於靜態記憶體中,也就是不屬於堆疊的記憶體,這類變數成為靜態變數。對於這類變數,你無法為他們制定其他儲存型別。

靜態變數在程式執行之前建立,在程式的整個執行期間始終存在。它始終保持原先的`值,除非給它賦一個不同的值或者程式結束。

在程式碼塊內部宣告的變數的預設儲存型別是自動的(automatic),也就是說他儲存於堆疊中,成為自動變數。有一個關鍵字auto就是用修飾這種儲存型別的,但它極少使用,因為程式碼塊中的變數在預設情況下就是自動變數在程式執行到宣告自動變數的程式碼塊時,自動變數才被建立,當程式的執行流離開該程式碼時,這些自動變數便自行銷燬。如果該程式碼塊被數次執行,例如一個函式被反覆呼叫,這些自動變數每次都將重新建立。在程式碼塊再次執行時,這些自動變數在堆疊中所佔據的記憶體位置有可能和原先的位置相同,也可能不同。及時他們所佔據的位置相同,你也不能保證這塊呢村同時不會有其他的用途,因此,我們可以說自動變數在程式碼塊執行完畢後就消失。當代碼塊再次執行時,他們的值一般並不是上次執行時的值。

對於在程式碼塊內部宣告的變數,如果給它加上關鍵字static,可以使他的儲存型別從自動變為靜態。具有靜態儲存型別的變數在整個程式執行過程中一直存在,而不僅僅在宣告它的程式碼塊的執行時存在。注意,修改變數的儲存型別並不標示修改該變數的作用域,它任然只能在該程式碼塊內部按名字訪問。函式的形式引數不能宣告。

最後,關鍵字register可以用於自動變數的宣告,提示他們應該儲存於機器的硬體暫存器而不是記憶體中,這類變數稱為暫存器變數。通常,暫存器變數比儲存於記憶體的變數訪問起來效率更高。但是,編譯器並不一定要理財register關鍵字,如果有太多的變數被宣告為register,它只選取前幾個實際儲存於暫存器中,其餘的就按普通自動比那輛處理。如果一個編譯器自己具有一套暫存器優化方法,它可能忽略register關鍵字,

使用:使用說明,為了加快程式的編譯速度,你希望把使用頻率最高的那些變數宣告為暫存器變數,在有些計算機中,如果你把指標宣告為暫存器變數,程式的效率將能得到提高,有其是那些頻繁的執行間接訪問操作的指標,你可以把函式的形式引數宣告為暫存器變數,編譯器會在函式的起始位置生成指令,把這些值從堆疊複製到暫存器中。但是,完全有可能,這個優化措施所節省的時間和控制元件的開銷還抵不上覆制這幾個值所用的開銷。

暫存器變數的建立和銷燬時間和自動變數相同,但它需要一些額外的工作。在一個使用暫存器變數的函式返回之前,這些暫存器先前儲存的值必須恢復,確保呼叫者的暫存器變數未被破壞。許多機器使用執行時堆疊來完成這個任務。當函式開始執行時,它把需要使用的所有暫存器的內容都儲存到堆疊中,當函式返回時,這些值再複製回暫存器中。在許多機器的硬體實現中,並不為暫存器指定的地址。同樣由於暫存器值的儲存和恢復某一個特定的暫存器在不同的時刻所儲存的值不一定相同。基於這些理由,機器並不像你提供暫存器變數的地址。