【C++11 笔记】关键字剖析 —— static

目录

一、static 的含义

二、C / C++ 内存分布

三、static 和 函数

2.1 static 与 函数变量

三、static 和 类

3.1 static 数据成员

3.2 static 类实例对象

3.3 static 成员函数

四、小结

4.1 静态全局变量

4.2 静态局部变量

4.3 静态数据成员

4.4 静态成员函数

五、其他


一、static 的含义

当与不同类型一起使用时,static 关键字具有不同的含义。通常,将 static 关键字用于局部变量、函数变量及类成员中,以下将分别阐述。


二、C / C++ 内存分布

【C++11 笔记】关键字剖析 —— static_第1张图片

【C++11 笔记】关键字剖析 —— static_第2张图片

 上图是 C / C++ 的内存分布示意图,各区/段简介如下:

  • 代码区(text segment)

该区加载程序的 可执行文件代码段,所有 可执行程序的机器码 都加载到本内存块,且不可在运行期间修改。

  • 未初始化数据区(bss - block started by symbol)

该区加载程序的  可执行文件 BSS 段,存储于此的数据(全局未初始化变量,静态未初始化变量(默认设为 0)) 的生存周期为整个程序运行过程,其位置可分开或紧靠数据段。

  • 全局初始化数据区 / 静态数据区(data segment)

该区加载程序的  可执行文件数据段,存储于此的数据(全局已初始化变量,静态已初始化变量,常量数据(如字符串常量))的生存周期为整个程序运行过程。

  • 栈区(stack)

栈是一种先进后出(FILO)的内存结构,从高地址向低地址增长,由编译器自动管理(分配释放),存放局部变量、函数的参数值和返回值等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。

  • 堆区(heap)

堆是一个容量远大于栈的大容器,但不是 FILO 的顺序。堆用于程序中的 动态内存分配(malloc / new)从低地址向高地址增长。堆在内存中位于 BSS 区和栈区之间。一般由程序员通过内存管理手动分配和释放,若程序员不释放(free / delete),可能导致内存泄露问题。


三、static 和 函数


2.1 static 与 函数变量

当函数中的变量被声明为 static 时,其内存空间将在程序的生命周期内分配 —— 被存放于 全局未初始化数据区 (bss)。一旦 static 变量被初始化,就会被存放在 全局初始化数据区 (data) 直至整个程序结束即便后续再多次调用该函数,静态变量的内存空间也 不会再分配。与之对应地,

你可能感兴趣的:(【C++筑基】)