C++中static详解

2017-01-01 10:25:09来源:CSDN作者:LaoJiu_人点击

欢迎到我的新博客访问原文链接http://www.61mon.com/index.php/archives/166/

  要想深层次的理解static,必须先理解C++中内存分配方式和C++链接属性。

一:C++内存分配方式

  先看C++中内存的分配方式。
  在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
  ,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  ,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
  自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

二:C++链接属性

  请参见C++链接属性

三:static

3.1 static全局变量

  内存放置在全局/静态存储区,其链接属性为内部链接,也就是只可以在本编译单元访问。注意与普通全局变量的异同,相同点是都放置在全局/静态存储区,不同点就是普通全局变量的链接属性默认是外部链接,这在上面已经说过。

#include<iostream>using namespace std;static int a=1;  //静态全局变量int b=1;         //普通全局变量int main(){  return 0;}

3.2 static局部变量

  所谓局部变量,就是定义在函数内部的变量。那static局部变量普通局部变量有什么区别?
  1 位置:普通局部变量一般放置在栈上(new和malloc的内存放置在堆和自由存储区);静态局部变量放置在全局/静态存储区。
  2 生命周期:普通局部变量随函数结束,若其内存分配在栈上会自动释放,若是在堆或自由存储区,需要程序员手动delete或free;静态局部变量的生命周期会伴随整个程序,注意,是整个程序,而非函数,也正是这个优点,我们才会经常遇到静态局部变量的妙用。
  3 访问权限:都只能在函数内部访问。
  4 值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。

#include<iostream>using namespace std;void func(){  static int s_num=0;//静态局部变量  int num=0;         //普通局部变量  cout<<s_num<<" "<<num<<endl;  s_num+=10;  num+=10;}int main(){  func();  //输出0 0  func();  //输出10 0  return 0;}

3.3 static函数

  如果只是一个static普通函数,因为其内部链接的属性,由static修饰的函数只能在本编译单元访问,这在上面已经说过。
  当然若是static类成员函数呢,那由static修饰的类成员函数表明该函数属于类,而非对象,也就是所有对象共享这一个函数;同样,static修饰类成员变量,也表明该变量属于类,而非对象。因为对象共享的特性,所以这样的设计可以节省内存空间。



最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台