static修飾的函數和普通函數有什么區別
時間:2024-05-11 來源:華清遠見
在編程語言中,有很多地方會用到static修飾的函數,那么static修飾的函數和普通函數有哪些區別呢,這里就一下幾個方對其進行分析:
作用域:
Static 修飾的函數:僅限定在本源碼文件中,不能被本源碼文件以外的代碼文件調用。因為此特性所以不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因為同名也沒有關系
普通函數:普通的函數,默認是extern的,也就是說,可以被其它代碼文件調用該函數,在調用前需要引用頭文件或者在使用的文件中進行extern外部聲明
生命周期:
Static 修飾的函數:生命周期和程序整個運行時間相同,直到退出應用程序,這樣避免了調用函數時壓棧出棧,速度會快很多
普通函數:生命周期僅限于該函數被調用的時段
編譯方式
Static 修飾的函數:在編譯時會被編譯器標記為本地函數
普通函數:在編譯時不會被標記
內存分配:
Static 修飾的函數:static函數在內存中只有一份,分配內存空間僅一次,且在程序運行期間一直存在,調用時并不會重新分配內存空間。
普通函數:普通函數調用時從堆棧中動態分配內存空間,函數運行結束后返回時空間被釋放
以下是一段簡單的程序,用于演示靜態函數和非靜態函數的區別:
#include <stdio.h>
void non_static_func() {
int num = 0;
printf("non_static_func num: %d\n", num);
num++;
}
static void static_func() {
static int num = 0;
printf("static_func num: %d\n", num);
num++;
}
int main() {
int i;
for (i = 0; i < 3; i++) {
non_static_func();
static_func();
}
return 0;
}
通過運行程序,我們可以看到以下結果:
non_static_func num: 0
static_func num: 0
non_static_func num: 0
static_func num: 1
non_static_func num: 0
static_func num: 2
我們可以看出,non_static_func函數每次被調用時,變量num的值始終為0,并沒有被保留下來。而static_func函數每次被調用時,變量num的值可以被保留下來,并在下次調用時繼續使用。這是因為static_func函數中的變量num是靜態變量,其生命周期保持到程序結束,而non_static_func函數中的變量num是一個普通的自動變量,其生命周期僅限于函數調用過程中。
因此,我們可以看出,靜態函數中的靜態變量可以在多次函數調用之間保持變量值不變,而非靜態函數中的變量則不會保留之前的值。這是靜態函數與非靜態函數的一個主要區別。

