static关键字的内存原理
- 分配在全局数据区
- 编译期初始化,默认初始化为零
static在不同场景中的效用
目录
- 成员变量
- 成员函数
- 全局变量
- 局部变量
- 普通函数
成员变量
- 根据其内存性质,我们知道这个变量是类本身的一个属性,记得是类而不是对象,所以它对于所有实例化的对象而言是共享属性。此外,它不构成对象的内存空间,所以sizeof(xxx)的值等于除静态变量外所哟成员变量大小的总和;
- 定义和初始化同步进行,可以不加static关键字,声明时不分配内存空间;
- 功能属性:用于实现对象间数据共享,主要针对对于与类本身高度耦合的数据;
4 静态数据成员常用作计数器,被对象的成员函数调用,此时记得考虑包含静态成员的构造函数,应该重写拷贝构造函数;
成员函数
- 和静态数据成员类似,静态函数也是属于类本身,所以他所使用的变量不能是任意对象所拥有的,比如不包含this指针(对象空间的初始地址),对象的非静态成员等;
2 语法规则:出现在类体外的函数定义不能指定关键字static;静态成员函数因为其编译期属性和没有this的开销,所以效率会更高;可以通过对象和类名调用静态成员(权限允许的情况下)
3 因为const成员函数本身会限制对对象属性的修改包括this指针,所以对于成员函数而言,const和static不能共存;
静态全局变量
- 在全局数据区分配(空间不会被释放直至进程结束)
- 可见性:本文件全局可见,其他文件不可见
静态局部变量
- 和全局静态变量一样在全局数据区分配
- 只会在声明时初始化一次,除此之外保持上次被使用的值
- 作用域为局部,但是不会被释放直至程序运行结束
静态函数
只有一点:仅当前文件可见,避免不同文件中函数名的冲突
总结
static变量被分配在静态内存区,在编译时分配空间并初始化,与动态内存区变量区分开来,能够有效地构建类型固有属性,在对象之间共享,节省程序动态运行开支,同时保持程序命名空间的独立性