回覆列表
-
1 # TonyDeng
-
2 # 使用者3485422457492
不是,不同位置效能不一樣,①必須要在使用前定義,最好臨使用時定義。main{int a;sleep(10000);……a=1;//定義過早長時間佔用記憶體不使用
}
-
3 # NMLINUX
c語言定義變數是有位置規定的,不是什麼地方都能定義的,c語言的變數可以定義在棧區和全域性變數區。
棧區就是函式體內區域性變數申請的記憶體所在記憶體區,例如int a; char* p;等申請的記憶體。區域性變數的記憶體是函式呼叫時系統臨時分配的,所以效率會較低,但是函式退出後系統會回收區域性變數分配的記憶體,避免了記憶體長時間被佔用。建議多使用區域性變數。
全域性變數區定義的變數有兩種,一種是全域性變數,此變數在所有函式體外例如 int b; int main(){...return 0;} ;一種是用static修飾的變數,例如static int c;static可以修飾區域性變數(其修飾的區域性變數的作用範圍在函式體內)和全域性變數,static修飾的變數存放在全域性變數區。全域性變數的記憶體是程式編譯時,編譯器分配的,所以全域性變數的效能最高。全域性變數區申請的記憶體在程式執行結束後才釋放,如果大量在全域性變數區申請記憶體,將有可能導致記憶體洩露,且不利於程式碼的閱讀性和可維護性。所以儘量少申請全域性變數區的記憶體。
這要看你使用編譯器遵循的C標準,早期的標準是不行的,在向C++借鑑後,C標準允許變數在使用前宣告並定義,與C++相同。
由於區域性變數是在棧上分配的,棧的資源有限,能少佔用及縮短使用時間是應該的,故變數在最接近使用時的位置定義是好習慣。不過,在棧上分配的資料才有這種好處,在堆上的就不是這樣了,兩者是反著來的。
另一個需要注意的地方,是宣告和定義不是一回事。諸如int x這樣的語句,只是宣告,它是沒有初始化的,在棧上分配時,會得到隨機值,所以一般高階語言都規定未初始化的變數不能使用。C例外,它允許這樣做,但你用到的就是隨機值,這是C程式設計裡經典的陷阱,任何一本講C語言的權威著作都會提到。但如何處理這個缺陷,卻是語言標準沒有硬性規定的,好的編譯器,會給出警告,不要聽某些三腳貓教誨,讓你關閉甚至不理睬警告,那一定會出bug,C++程式設計規範給出的忠告是把編譯器的警告級別開到最高並設定為錯誤等級,強制編譯不成功,程式設計師應該把所有警告都處理乾淨,蔑視編譯器或自以為比編譯器高明是程式設計師最大的陷阱——也不要以為什麼平臺的編譯器比其他編譯器更高明,它行的並不表示別人不行是人家無理,我見過某編譯器擴充套件的“動態陣列”就充滿陷阱,但許多程式設計師樂此不疲,認為是比人家編譯器強的地方,用它誘導初學者使用這種編譯器。