总结一下static在C/C++中的作用。
https://blog.csdn.net/weixin_41143631/article/details/81221512参考我的这篇笔记。
static 变量 未初始化就放在 BSS segment ,已初始化的 就放在 Data segment,但可以认为BSS或Data段都是静态区。
C++中可以认为是一块区域。
明白一个变量的存储区域便可以很好理解其使用性质。
static类型分配在静态存储区,在程序整个运行期间都不释放,这是其作用。
知识点A: 存储在静态数据区的变量会在程序刚开始运行时就完成初 始化,也是唯一的一次初始化。这也是实现单例模式的一个诀窍,巧妙运用静态数据区的性质。
知识点B:静态数据区的变量只在定义它的源文件内有效,其他源文件无法访问它。作用域应该是声明这个变量的CPP 或C 文件,其他文件无法使用。(不推荐在头文件中定义,因为包含头文件实际是copy所有头文件内容,会导致重复定义)
class A {
public:
int a;
static int b;
};
//主函数
A classa;
printf("%d\n", sizeof(classa));
classa.b = 20;
cout << classa.b << endl;
A class_b;
cout << class_b.b << endl;
显然会classa的大小只会为4。且对b赋值会影响所有实例。 会打印 4,20,20.
知识点C:static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化。
static变量是属于类的,而不是对象的。
总体而言性质和常量区大同小异,常量区存储全局变量和const修饰的。
const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。这和static有所区别。
const char *s1 = "hello, world";
const char *s2 = "hello, world";
s1,s2存储的地址其实是同一个,这也是因为hello,world存储常量区。
const定义的常量在超出其作用域之后其空间会被释放
extern全局变量存储在静态区。
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 - 程序结束后由系统释放。
顺便一提,C语言中还有关键字register使变量直接存储于寄存器。