【发布时间】:2010-09-10 21:17:27
【问题描述】:
当有人谈论变量存储类说明符时,他们在谈论什么?
他们还经常在同一个上下文中谈论变量链接,那是什么?
【问题讨论】:
当有人谈论变量存储类说明符时,他们在谈论什么?
他们还经常在同一个上下文中谈论变量链接,那是什么?
【问题讨论】:
存储类说明符控制变量的存储和链接。这是两个不同的概念。 C 为变量指定以下说明符:auto、extern、register、static。
存储
存储持续时间决定了您的变量将在 ram 中存在多长时间。
存储时长分为三种类型:静态、自动和动态。
静态
如果您的变量是在文件范围内声明的,或者使用 extern 或 static 说明符,它将具有静态存储。只要程序正在执行,该变量就会存在。创建这些变量不会花费任何执行时间。
自动
如果变量在函数中声明,但没有 extern 或 static 说明符,则它具有自动存储功能。该变量仅在您执行该函数时才存在。一旦你返回,变量就不再存在。自动存储通常在堆栈上完成。创建这些变量是一个非常快速的操作(只需将堆栈指针增加大小)。
动态
如果您使用 malloc(或 C++ 中的新功能),则您使用的是动态存储。在您调用 free(或删除)之前,此存储将一直存在。这是创建存储最昂贵的方式,因为系统必须动态管理分配和解除分配。
联动
链接指定谁可以查看和引用该变量。联动分为内联动、外联动和无联动三种。
没有链接
这个变量只在它被声明的地方可见。通常适用于在函数中声明的变量。
内部链接
该变量将对文件中的所有函数可见(称为translation unit),但其他文件将不知道它的存在。
外部链接
该变量将对其他翻译单元可见。这些通常被认为是“全局变量”。
这是一个基于说明符描述存储和链接特征的表格
存储类函数文件 说明符作用域 -------------------------------------------------- --- 无自动静态 无联动 外联动 外部静态静态 外联 外联 静静静静 无联动内联动 auto 自动无效 无联动 注册自动无效 无联动【讨论】:
变量存储类或类型说明符(如 volatile、auto 和 static)定义程序执行期间变量的保存方式/位置。例如,函数中定义的变量通常保存在堆栈中,这意味着函数返回后会丢失。使用“static”关键字,您可以强制编译器将变量放在内存中的数据段中,使变量内容在对该函数的调用之间保持不变。 “register”关键字将导致编译器尽可能将变量放入 CPU 寄存器中,这对于循环中的计数器等很有用。但是,它毕竟不能保证它实际上在寄存器中。
阅读更多关于类型说明符here。
【讨论】:
register 已完全过时,除非(通过强制执行)您的代码不允许使用变量的地址。