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

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關鍵字,

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

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