ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 一.程序内存存储结构 | 存储区 | 生命周期 | | ---- | ---- | | 堆区 *heap* | 动态生命期 | | 栈区 *stack* | 局部生命期 | | 数据区 *data* | 静态生命期 | | 代码区 *code* | 静态生命期 | ## 二.生命周期简介 1. 静态生命期 + **时间** [长]整个程序运行期。 + **时机** 预编译时期。 + **对象** 全局变量,静态全局变量,静态局部变量,const常变量,函数。 + **存储** 数据区/代码区。 + **初值** 变量若不作显式初始化,C++编译器会自动将其初始化成(相应类型的)0。 2. 局部生命期 + **时间** [短]起始于声明点,结束于作用域结束处。 + **时机** 编译时期。 + **对象** 局部变量。 + **存储** 栈区。 + **初值** 若不作初始化,其值不确定。 3. 动态生命期 + **时间** [短]由程序员自行干预。 + **时机** 运行时期。 + **对象** 程序员手动分配的空间。 + **存储** 堆区。 + **初值** 若不作初始化,其值不确定。 ## 三.存储类型 1. **auto** + 定义:自动申请和释放内存的变量,变量不会自动初始化 + 作用域:语句块内 + 存储位置:一般为内存的栈区 + 生存周期:语句块内 + **局部变量的默认存储类型为auto** 2. **static** + 作用域 + 静态局部变量:语句块内 + 静态全局变量:定义它的文件内,定义点->文件结尾 + 存储位置:内存的数据区 + 生存周期:整个程序的运行期 + **没有显式初始化的静态变量在编译阶段自动初始化为0**。 3. **register** + **优点** 执行速度快 + 定义的变量存储于CPU的寄存器。 + 不能用register定义数组。 + 除存储位置不同外,其余与auto基本相同。 + 现代编译器能够自动优化程序,把普通变量优化为寄存器变量,并且可以忽略用户的register指定,一般情况无需特别声明变量为register。 4. **extern** + 使用extern关键字引用一个已存在的变量(或函数)。 >[info]extern用于声明,其余关键字用于定义。 ## 四.延长生命期的方法 1. 引用一个右值,会延长右值的生命期,使得右值的生命期与引用的生命期相同。