当前位置: 首页 > news >正文

存储期类别

文章目录

  • 前言
  • 一、自动存储期(Automatic Storage Duration)
  • 二、静态存储期(Static Storage Duration)
  • 三、动态存储期(Dynamic Storage Duration)
  • 四、线程存储期(Thread Storage Duration)
  • 总结


前言

在编程中,存储期(Storage Duration) 指的是变量在程序中存在的时间段。C 语言中主要有以下几种存储期:

一、自动存储期(Automatic Storage Duration)

  • 定义:变量在其作用域内自动分配内存,当离开作用域时自动释放。
  • 示例:局部变量。
  • 特点:变量在函数调用时创建,在函数返回时销毁。内存空间由栈管理,通常分配和释放速度较快。

示例 :

void function() {int localVar = 10; // 自动存储期
} // localVar 在此处被销毁

二、静态存储期(Static Storage Duration)

  • 定义:变量在程序的整个运行期间存在,直到程序结束时才释放。
  • 示例:全局变量和使用 static 关键字定义的变量。
  • 特点:在程序开始时分配内存,并在整个程序生命周期内保持。静态变量在函数调用之间保持其值。

示例 :

int globalVar = 20; // 静态存储期void function() {static int staticVar = 30; // 静态存储期staticVar++;
}

三、动态存储期(Dynamic Storage Duration)

  • 定义:变量在运行时动态分配内存,程序员需要手动管理内存的分配和释放。
  • 示例:使用 malloccallocrealloc 等函数分配的内存。
  • 特点:变量的生命周期由程序员控制,直到调用 free 释放内存。适合需要在运行时动态调整大小的情况。

示例 :

#include <stdlib.h>void function() {int* dynamicVar = (int*)malloc(sizeof(int)); // 动态存储期*dynamicVar = 40;free(dynamicVar); // 释放内存
}

四、线程存储期(Thread Storage Duration)

  • 定义:变量在其所属线程的整个生命周期内有效,直到线程结束时才被销毁。
  • 示例:可以使用 __thread 关键字(在某些编译器中)或 POSIX 线程库提供的 pthread_key_t 来实现线程存储期的变量。
  • 特点:每个线程都有自己的存储空间,线程存储期的变量对其他线程不可见。线程存储期的变量在线程创建时分配内存,并在该线程结束时自动释放。适合存储线程特有的数据,如线程的状态、局部缓存等。

示例 :

#include <stdio.h>
#include <pthread.h>__thread int threadLocalVar = 0; // 线程存储期变量void* threadFunction(void* arg) {threadLocalVar++; // 每个线程都有自己的 threadLocalVarprintf("Thread %ld: threadLocalVar = %d\n", (long)arg, threadLocalVar);return NULL;
}int main() {pthread_t threads[2];for (long i = 0; i < 2; i++) {pthread_create(&threads[i], NULL, threadFunction, (void*)i);}for (int i = 0; i < 2; i++) {pthread_join(threads[i], NULL);}return 0;
}

总结

理解存储期有助于更好地管理内存和变量的生命周期,从而提高程序的效率和安全性。

http://www.lryc.cn/news/470437.html

相关文章:

  • 开源模型应用落地-Qwen2-VL-7B-Instruct-vLLM-OpenAI API Client调用
  • 风电叶片损伤YOLO检测数据集(猫脸码客第229期)
  • 修改 RN 打包后生成的app-release 安装包的名称
  • 大模型EfficientSam用于图像语义分割自动标注
  • 一个关于@JsonIgnore的isxxx()问题
  • Django-cookie,session
  • HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例
  • 【已解决,含泪总结】非root权限在服务器Ubuntu18.04上配置python和torch环境,代码最终成功训练(二)
  • Flutter鸿蒙next 刷新机制的高级使用【衍生详解】
  • c/c++--静态变量和静态函数(static)
  • Windows系统启动MongoDB报错无法连接服务器
  • Linux的makefile与进度条小程序实践
  • latex写作基础
  • Chromium HTML5 新的 Input 类型email对应c++
  • 嵌入式Linux的AXI平台(platform)驱动教程
  • 什么是Java策略模式?与Spring的完美结合
  • [Go实战]:HTTP请求转发
  • 【C++单调栈 贡献法】907. 子数组的最小值之和|1975
  • 极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】
  • Django 5 增删改查 小练习
  • 【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)
  • 基于SSM+小程序的旅游社交登录管理系统(旅游4)
  • 高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
  • Java-内部类
  • flutter集成极光推送
  • D. Skipping 【 Codeforces Round 980 (Div. 2)】
  • 【golang】学习文档整理
  • 动态规划-子序列问题——1218.最长定差子序列
  • 双子塔楼宇可视化系统:提升建筑管理与运营效率
  • 32位的ARMlinux的4字节变量原子访问问题