const,static总结

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const,static总结相关的知识,希望对你有一定的参考价值。

const,static等总结

概览

注意
上图中的char_v字符数组是存储在栈上的,char_v是首元素地址解引用,为‘a’同样是在栈上(注意区分ptr_char_v和*char_v)

:(向下)
函数调用建立栈帧,参数,函数中的局部变量都存在栈帧中

:(向上)
malloc,realloc,calloc,new,new[]出来的都在堆上
理论上而言,后malloc的内存地址比先malloc的大,但不一定,因为下一次申请的空间可能是之前释放的

数据段(静态区)
通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配。数据段属于静态内存分配
静态区3点作用static,全局

  1. 静态全局变量只能在本变量的源文件中使用
  2. 存储在静态数据区的变量(全局变量静态变量)会在程序刚开始运行时就完成初始化,也是唯一的一次初始化,下图为例子
  3. 在静态数据区,内存中所有的字节默认值都是0x00

按作用域

  1. 全局变量:在整个工程文件内都有效
    main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已,全局变量一定是定义在函数外部的)
  2. 局部变量:局部变量的作用域是定义该变量的函数或定义该变量的复合语句
  3. 静态全局变量:只在定义它的文件内有效
  4. 静态局部变量:只在定义它的函数内有效,且程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效

按存放位置

  1. 全局变量:静态区
  2. 局部变量:栈
  3. 静态全局变量:静态区
  4. 静态局部变量:静态区

static的作用
在C中:

  1. 修饰全局变量和全局函数,改变链接属性,只在当前文件可见,其他文件不可使用
  2. 修饰局部变量,改变生命周期,局部变为全局

在C++中:

  1. C++兼容C中的属性
  2. 修饰成员变量和成员函数,成员变量属于整个类,所有对像共享,成员函数没有this指针

static成员特性

  1. 静态成员变量为所有类对象所共享,不属于某个具体的对象,放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,如:int A::_count = 0;
    (分析静态成员变量在全局位置定义初始化,因为每实例化一个对象,构造函数就去初始化一次并不合理,static变量只用初始化一次)
  3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
  4. 静态成员函数没有隐藏的this指针不能访问任何非静态成员
    参考:C++初阶—类和对象(入门)的this指针部分
  5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

按存放位置 const对变量的存放位置没有影响


const变量通过指针修改(两种情况)

  1. 对于局部const变量是可以通过指针来修改的
    对于gcc编译器:编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10
    对于vs编译器:会打印出修改后的值


  1. 对于全局const变量不可以通过指针来修改

结论

  1. const局部变量存储在堆栈中,可通过指针修改其值
  2. const全局变量存储在全局存储空间,其值只有可读属性,不能修改

代码段
代码段在内存中被映射为只读。它是由编译器在编译链接时自动计算的。通常是用来存放可执行代码(二进制指令)和只读常量,代码段输入静态内存分配

以上是关于const,static总结的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中 const,static,extern用法总结

C++ const 和static的总结以及使用

[Effective C++, 学习总结] 03 尽可能使用const

4CPP 面向对象之 ——多态多继承static 成员const 成员

[c#] const 与 readonly

class中static总结-静态成员函数和静态成员变量