const,static总结
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const,static总结相关的知识,希望对你有一定的参考价值。
概览
注意
:
上图中的char_v字符数组是存储在栈上的,char_v是首元素地址解引用,为‘a’同样是在栈上(注意区分ptr_char_v和*char_v)
栈
:(向下)
函数调用建立栈帧,参数,函数中的局部变量
都存在栈帧中
堆
:(向上)
malloc,realloc,calloc,new,new[]出来的都在堆上
理论上而言,后malloc的内存地址比先malloc的大,但不一定,因为下一次申请的空间可能是之前释放的
数据段(静态区)
:
通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配。数据段属于静态内存分配
静态区
3点作用:(static,全局
)
静态
,全局变量
只能在本变量的源文件
中使用- 存储在
静态数据区
的变量(全局变量
,静态变量
)会在程序刚开始运行时就完成初始化,也是唯一的一次初始化
,下图为例子
- 在静态数据区,内存中所有的字节默认值都是0x00
按作用域
:
全局变量
:在整个工程文件内都有效
(main 函数内的变量不是全局变量,而是局部变量
,只不过它的生命周期和全局变量一样长而已,全局变量一定是定义在函数外部的)局部变量
:局部变量的作用域是定义该变量的函数或定义该变量的复合语句静态全局变量
:只在定义它的文件内有效静态局部变量
:只在定义它的函数内有效,且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效
按存放位置
:
全局变量
:静态区局部变量
:栈静态全局变量
:静态区静态局部变量
:静态区
static的作用
:
在C中:
- 修饰全局变量和全局函数,改变链接属性,只在当前文件可见,其他文件不可使用
- 修饰局部变量,改变生命周期,局部变为全局
在C++中:
- C++兼容C中的属性
- 修饰成员变量和成员函数,成员变量属于整个类,所有对像共享,成员函数没有this指针
static成员特性
:
- 静态成员变量为所有类对象所共享,不属于某个具体的对象,放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,如:
int A::_count = 0;
(分析
:静态成员变量在全局位置定义初始化,因为每实例化一个对象,构造函数就去初始化一次并不合理,static变量只用初始化一次
)- 类静态成员即可用类名::静态成员或者对象.静态成员来访问
静态成员函数没有隐藏的this指针
,不能访问任何非静态成员
(参考:C++初阶—类和对象(入门)的this指针部分)- 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值
按存放位置
: const对变量的存放位置没有影响
const变量通过指针修改(两种情况)
:
对于局部const变量是可以通过指针来修改的
对于gcc编译器:编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10
对于vs编译器:会打印出修改后的值
对于全局const变量不可以通过指针来修改
结论
:
- const局部变量存储在堆栈中,可通过指针修改其值
- const全局变量存储在全局存储空间,其值只有可读属性,不能修改
代码段
:
代码段在内存中被映射为只读。它是由编译器在编译链接时自动计算的。通常是用来存放可执行代码(二进制指令)和只读常量,代码段输入静态内存分配
以上是关于const,static总结的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发中 const,static,extern用法总结
[Effective C++, 学习总结] 03 尽可能使用const