在编程语言中,有很多地方会用到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是一个普通的自动变量,其生命周期仅限于函数调用过程中。
因此,我们可以看出,静态函数中的静态变量可以在多次函数调用之间保持变量值不变,而非静态函数中的变量则不会保留之前的值。这是静态函数与非静态函数的一个主要区别。