美文网首页
C - 存储期

C - 存储期

作者: changsanjiang | 来源:发表于2017-10-12 21:04 被阅读15次

作用域链接描述了标识符的可见性. 存储期描述了通过这些标识符访问的对象的生存期.
C 对象有 4 中存储期: 静态存储期, 线程存储期, 自动存储期, 动态分配存储期.

如果对象具有静态存储期, 那么他在程序的执行期间一直存在. 文件作用域变量具有静态存储期. 注意, 对于文件作用域变量, 关键字 static 表明了其链接属性, 而非存储期. 以 static 声明的文件作用域变量具有内部链接. 但是无论是内部链接还是外部链接, 所有的文件作用域变量都具有静态存储期.

线程存储期用于并发程序设计, 程序执行可被分为多个线程. 具有线程存储期的对象, 从被声明时到线程结束一直存在. 以关键字 _Thread_local 声明一个对象时, 每个线程都获得该变量的私有备份.

块作用域的对象通常都具有自动存储期. 当程序进入定义这些变量的块时, 为这些变量分配内存; 当退出这个快时, 释放刚才为变量分配的内存. 这种做法相当于把自动变量占用的内存视为一个可重复使用的工作区或暂存区. 例如, 一个函数调用结束后, 其变量占用的内存可用于存储下一个被调用函数的变量.
变长数组稍有不同, 他们的存储期从声明处到块的末尾, 而不是从块的开始处到块的末尾.
在下面的代码中, 变量 number 和 index 在每次调用 bore()函数时被创建, 在离开时被销毁:

void bore(int number) {
 int index;
 for ( index = 0 ; index < number ; index ++ ) {
  puts("They don't make them the way they used to.\n";
 }
}

然而, 块作用域变量也能具有静态存储期. 为了创建这样的变量, 要把变量声明在块中, 且在声明前加上关键字 static:

void more(int number) {
 int index;
 static int ct = 0;
}

这里, 变量 ct 存储在静态内存中, 他从程序被载入, 到程序结束期间都存在. 但是, 他的作用域定义在more()函数中. 只有在执行该函数时, 程序才能使用 ct 访问他所指定的对象(但是, 该函数可以给其他函数提供该存储区的地址以便间接访问该对象, 例如通过指针形参或返回值).


C 使用作用域, 链接和存储期为变量定义了多种存储方案.
5 中存储类别:

存储类别 存储期 作用域 链接 声明方式
自动 自动 块内
寄存器 自动 块内, 使用关键字 register
静态外部链接 静态 文件 外部 所有函数外
静态内部链接 静态 文件 内部 所有函数外, 使用关键字 static
静态无连接 静态 块内, 使用关键字 static

相关文章

  • C - 存储期

    作用域和链接描述了标识符的可见性. 存储期描述了通过这些标识符访问的对象的生存期.C 对象有 4 中存储期: 静态...

  • DCL30-C. 用合适的存储期声明对象

    DCL30-C. 用合适的存储期声明对象[https://wiki.sei.cmu.edu/confluence/...

  • C语言-存储期(storage duration)

    存储期 在函数中声明的变量,并不是从程序开始到程序结束始终有效的。变量的生存期也就是生命有两种,它们可以通过存储期...

  • C++存储类别

    变量的另一种属性:存储期(也称生命期) 存储期是指变量在内存中的存在期间。可以分为静态存储期和动态存储期! 全局变...

  • 16C++ 数据结构

    线性表顺序存储 sqlist.h sqlist.c test.c 线性表链式存储 test.c linklist....

  • Variable storage

    变量除了作用域,还有存储期(storage duration)。存储期是指变量在内存中的存在期间。存储期可以分为静...

  • 发现nuget包太占用C盘,怎么办?

    如何发现的? 查看C盘存储 打开所有设置->系统->存储->选择C盘image.png 查看C盘使用情况,可以查看...

  • C语言存储

    参考: C存储类-菜鸟教程C语言register关键字—最快的关键字c primer plus 6th editi...

  • C存储类

    在C语言中,程序内变量或函数的作用域和寿命是由其存储类决定的。每个变量都有其生命周期,或存储其值的上下文。函数和变...

  • C++11:auto

    auto这个关键字在C++11之前就存在的,只不过当时它的含义是指明对象的存储期。这个用途在C++11中已经删除了...

网友评论

      本文标题:C - 存储期

      本文链接:https://www.haomeiwen.com/subject/apaoyxtx.html