补遗篇之static

    static的作用是IT公司C语言笔试必考题,看似简单却少有人能完整回答。因为它不止一个作用,并且随修饰对象的不同而变化,这里我总结成“有限生命变无限,无限空间变有限”。

    static有三类作用对象:函数、局部变量和全局变量。其中局部变量只在函数运行期间存活,即“有限生命”;而函数和全局变量的作用域是无限的,也就是“无限空间”。

    1)“有限生命变无限”是指static可以延长局部变量生命周期。C语言局部变量存放在栈中,其有效时间从函数调用时开始,到函数退出完成出栈操作后截止,所以它们的生命是有限的。但如果把函数内某局部变量用static修饰,该变量在函数多次调用过程中就能记住原来的值,它的生命周期不再是短暂的一次函数调用,而是扩展到整个程序运行周期。因此统计一个函数被调用多少次或检测它是否被首次调用,就经常使用static局部变量。如:

    void testfun()

    {

      static int fun_cnt = 0;

      if(fun_cnt == 0)

      ……

      fun_cnt ++;

    }

    这个函数只有首次调用时,static变量fun_cnt才为0,以后每次调用,变量值都递增,而如果fun_cnt是普通局部变量,函数结束后原本保存的值就丢掉了,以后每次都从0开始。而static变量之所以具备这种记忆功能,是因为它不再象普通局部变量那样存放在栈里,而是存在全局数据区,和全局变量的存储位置相同,所以函数进出栈的操作对它没有影响。

    2) “无限空间变有限”又是什么意思?C中全局变量和函数的作用空间默认是全局的(函数也可看作全局变量)。既然名称全局可见,重名的可能性必然增加(命名污染),static此时可以起到一定限制作用。

    全局变量和函数如果被static修饰,它们将不能被其他源文件访问,而只能在所处源文件内被调用。也就是说,static能把全局作用域限制到“本地”源文件里,以防止全局命名的冲突。可以这样理解其机制:static变量或函数,编译后生成的符号前会加上所在文件的文件名作前缀,这样链接时,因为文件名不同,就不会和其他文件里的同名变量冲突。

 

    除以上两点之外,用static修饰函数有时还能附带提高程序运行效率:编译器会把短小的static函数自动内联展开,以消除函数调用开销。这种智能操作的依据之一就是:static函数只能被本地文件内的函数调用,展开也不会影响其他文件的编译和整体链接。

总结static是对C固有问题(全局命名污染与局部变量短生命周期)的修补。对所有不需在其他源文件中使用的函数与全局变量都应用static修饰,有益无害

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值