C语言存储类

来源:互联网 发布:北京it外包 编辑:程序博客网 时间:2024/05/19 09:13
存储类、 作用域、 生命周期、 链接属性
C 语言符号有 3 种连接属性: 外部连接、 内部连接、 无连接。
内存有多种管理方法: 栈、 堆、 数据段、 bss 段、 .text 段······一个变量的存储类属性就是描述这个变量存储在何种内存段中。
代码段: 在 Linux 中又叫文本段(.text) 。
只读数据段: const 修饰的变量一般存在这段中, 不同平台可能不一样。
数据段: 1.显示初始化为非零的全局变量。 2.显示初始化为非零的 static 局部变量。
bss 段: 1.显示初始化为零或者未显示初始化的全局变量。 2.显示初始化为零或者未显示初始化的 static 局部变量
栈: 局部变量分配在栈上, 函数调用传参过程也在栈上。
堆: C 语言不会将东西自动存在堆上, 堆操作是程序员手动操作分配存放的。 用完后记得释
放。 (典型的 malloc 与 free)
文件映射区: 进程打开文件了以后, 将这个文件的内容从硬盘读到文件的映射区, 以后在内存中就直接操作这个文件, 读写完后保存时在文件写到硬盘中去。内核映射区: 将操作系统内核程序映射到这个区域。 每个进程都有自己的独立空间(虚拟内
存技术) , 但是, 内核是唯一的。


存储类的关键字
auto: 其作用就是修饰局部变量。 平时就是默认使用 auto 类型的, 表示自动局部变量, 其
分配在栈上。 (所以不初始化时, 值是随机的)
static: 第一, 它修饰局部变量, 形成静态局部变量。 静态局部变量和非静态局部变量的区
别就是, 非静态局部变量存储在栈上, 而静态局部变量存储在数据段或者 bss 段。 第二,
修饰全局变量。
register: 用来修饰变量, 编译器会尽量将它分配在寄存器中, 如果该变量会被高频率反复
使用, 那么 register 形式会让程序的效率变高。 编译器承诺将 register 修饰的变量放到寄
存器中, 但不保证一定能放入, 因为寄存器有限时, 没有空余的地方。
extern: 主要用来声明全局变量, 目的是能够让其他文件可以访问到, 为外部链接属性。
volatile: 意思是易变的、 可变的。 用来修饰变量, 表示这个变量可以被编译器以外的东西
改变(编译器之内改变就是代码改变变量的值, 编译之外就是编译器在编译代码之前无法预
知变量的改变, 它有可能在其他中断已经被改变或者被硬件改变) 。 三种编译以外的改变:
中断引用的变量、 多线程中公用的变量、 硬件会更改的变量。 编译器遇到 volatile 时不会对
该变量进行优化, 这样就以免出错。 应正确的使用, 滥用 volatile 可能会导致程序效率下降。
restrict: c99 中才支持的, 所以很多延续 c89 的编译器是不支持 restrict 关键字, gcc 支
持的。 restrict 也是和编译器行为特征有关的。 restrict 只用来修饰指针, 不能修饰普通变
量。 该关键字用于告诉编译器, 该指针所指向内容的全部操作全部基于该指针, 即不存在其
他其他修改操作的途径, 这样可以更好的帮助编译器进行更好的优化代码, 生成更有效率的
汇编代码。

原创粉丝点击