c語言符號定義、聲明、引用、作用域及生命期、優化

1、變量

全局變量:不用考慮初始化問題,若未被初始化,則編譯器自動設置爲0;

局部變量:存儲在內存的堆棧中,若未被初始化則使用其佔用內存空間原有的值,這個值是個隨機值,不初始化直接引用很危險。

2、定義及聲明

    一個函數只能(也必須)在一個源文件裏被定義,但是可以在其它多個源文件裏被聲明。定義引起存儲分配,是真正產生那個實體。而聲明並不引起存儲分配。打一個粗俗的比方:在源文件A中定義,在源文件B中聲明,好比在B裏開了一扇窗,讓它可以看到A裏的那個函數。

    聲明表示告訴編譯器該變量的存在,但是不爲該變量分配存儲空間(int a;);而在定義變量時不僅告訴編譯器該變量存在,而且爲該變量賦值,由於賦值了,所以變量的存儲空間就被分配了(int a=1;)。

    當變量的作用域範圍內只有聲明,沒有定義時,編譯器會自動將第1個聲明當作是變量的定義。例如:

int f(int a)

{

int b;//找不到對變量b的定義,因此該處聲明被認爲是變量的定義;分配4個字節的存儲空間給變量b

b=2;//這裏是對變量b賦值,不是定義

return a+b;

}


C語言中的符號解析規則:

1)、不允許有多個符號(變量或函數)的定義;

2)、如果有一個符號的定義和多個符號的聲明,則選擇被定義的符號;

3)、如果有多個符號的聲明,則從中任選一個作爲符號的定義;


3、引用

    如果定義函數的c/cpp文件在對應的頭文件中聲明瞭定義的函數,那麼在其他c/cpp文件中要使用這些函數,只需要包含這個頭文件即可。
  如果不想包含頭文件,那麼需要在其他c/cpp中聲明該函數。一般來說,聲明定義在本文件的函數不用“extern”,聲明定義在其他文件中的函數用“extern”,這樣在本文件中調用別的文件定義的函數就不用包含頭文件。

4、作用域及生命期

全局變量:定義在函數外部,生命期整個程序;

局部變量:定義局部變量的函數或複合語句內,調用結束後生命期就結束;

static 全局變量:生命期不變(整個程序執行過程一直存在),作用域減小(只在本文件函數中可以引用);

static 局部變量:生命期增加(整個程序執行過程一直存在),作用域不變;


5、函數有關優化

1)訪問內存在計算機的操作中很消耗時間,而每次調用函數都需要大量的時間來訪問內存,因此在程序的執行過程中儘量減少函數調用,將運行結果相同的函數合併;

2)全局變量存儲在數據段上也就是存儲在內存中,局部變量存儲在堆棧上。對於在程序中調用頻率高的局部變量,編譯器會自動將其存儲在寄存器,但是全局變量不會存儲在寄存器中,全局變量在整個程序執行過程中一直存在,那麼在整個程序執行過程中,該寄存器都將無法存儲臨時變量或中間值,這對於寄存器資源稀少的計算機是不可接受的,程序運行效率會大打折扣。而訪問內存的時間要遠遠大於cpu的計算時間,因此要較少內存訪問,不要將使用頻率高的變量設置爲全局變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章