详解C++的存储区

在C++中,存储期(Storage Duration)是指变量或对象在内存中存在的时间长度。根据存储期的不同,C++中的变量可以分为以下几种类型:

  1. 自动存储期(Automatic Storage Duration)

    • 定义 :自动存储期的变量是在函数内部定义的局部变量,不包括用static声明的局部变量。

    • 生命周期:从定义点开始,到包含它的代码块(通常是函数)结束时结束。每次函数被调用时,都会重新创建这些变量。

    • 示例

      cpp 复制代码
      void func() {
          int a = 10; // 自动存储期的变量
      }
  2. 静态存储期(Static Storage Duration)

    • 定义:静态存储期的变量在程序执行期间只被初始化一次,并在整个程序运行期间都存在。

    • 生命周期:从程序开始执行时开始,到程序结束时结束。

    • 分类

      • 全局变量:在函数外部定义的变量。
      • 静态局部变量 :在函数内部用static关键字声明的变量。
      • 静态成员变量 :在类中用static关键字声明的成员变量。
    • 示例

      cpp 复制代码
      int globalVar = 20; // 全局变量,静态存储期
      
      void func() {
          static int staticLocalVar = 30; // 静态局部变量,静态存储期
      }
      
      class MyClass {
      public:
          static int staticMemberVar; // 静态成员变量,静态存储期
      };
      
      int MyClass::staticMemberVar = 40;
  3. 线程存储期(Thread Storage Duration)

    • 定义:C++11引入,用于线程局部存储(Thread Local Storage,TLS),即每个线程都有自己的变量副本。

    • 生命周期:从线程开始执行时开始,到线程结束时结束。

    • 关键字 :使用thread_local关键字声明。

    • 示例

      cpp 复制代码
      thread_local int threadLocalVar = 50; // 线程局部存储期的变量
  4. 动态存储期(Dynamic Storage Duration)

    • 定义 :动态存储期的变量是通过动态内存分配(如使用new操作符)创建的,并且需要程序员显式地释放(如使用delete操作符)。

    • 生命周期 :从使用new分配内存时开始,到使用delete释放内存时结束。

    • 示例

      cpp 复制代码
      void func() {
          int* dynamicVar = new int(60); // 动态存储期的变量
          // 使用dynamicVar
          delete dynamicVar; // 释放内存
      }

总结

  • 自动存储期:局部变量,每次函数调用时创建和销毁。
  • 静态存储期:全局变量、静态局部变量和静态成员变量,程序执行期间一直存在。
  • 线程存储期:每个线程有独立的变量副本,线程结束时销毁。
  • 动态存储期 :通过new分配的内存,需要显式delete释放。

理解不同存储期的特点和用途对于编写高效、可靠的C++程序至关重要。

相关推荐
上弦月-编程1 分钟前
Java类与对象:编程核心解密
java·开发语言·jvm
Kapaseker3 分钟前
为什么 Java 的数组需要 new 出来
android·java·kotlin
Hua-Jay6 分钟前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
Dicky-_-zhang9 分钟前
线上故障排查与应急响应实战:从零开始建立你的SRE体系
java·jvm
大大杰哥10 分钟前
从 Volatile 到 ThreadLocal:Java 线程安全机制备忘
java·开发语言·jvm
AI人工智能+电脑小能手16 分钟前
【大白话说Java面试题 第67题】【JVM篇】第27题:生产环境服务器变慢,诊断思路和性能评估谈谈?
java·服务器·jvm·面试
崇山峻岭之间18 分钟前
matlab绘制复杂曲线
开发语言·matlab
半夜修仙18 分钟前
Redis中Set数据类型的常见命令
java·数据库·redis·笔记·学习
SuniaWang19 分钟前
AgentX 专栏-00前言:一个Java开发者的Agent实践之路
java·人工智能·spring boot·langchain·系统架构
skywalk816319 分钟前
中文编程语言的开创性语法,言律:一门以汉语为思维内核的原生中文编程语言
开发语言·编程