当前位置: 首页 > 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.mrgr.cn/news/59947.html

相关文章:

  • Autosar 启动过程-基于ETAS工具
  • StringBuilder——练习
  • Java | ReentrantLock 锁和 synchronized 锁的区别和共同特点是什么?
  • redis详细教程(2.List教程)
  • IllegalMonitorStateException:Illegal Monitor Operation 完美解决方法 ⚙️
  • Vue2 关于指令
  • 面向对象编程中类与类之间的关系(一)
  • git的学习之远程进行操作
  • 我的世界方块改进版
  • 排序算法(冒泡,插入),希尔排序(插入升级),希尔排序和插入排序时间比较!
  • JDBC: Java数据库连接的桥梁
  • ❤️算法笔记❤️-(每日一刷-5、最长回文串)
  • Kubernetes: Pod has unbound PersistentVolumeClaims
  • 土豆去皮机的结构设计(开题报告1)
  • 什么是AI神经网络?
  • 设计模式(三)
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21
  • 安装anacanda-学习笔记
  • 基于图神经网络的组合优化与推理(JML 2023)(未完)
  • linux指令笔记