关于c ++:什么是变量的链接和存储说明符?

关于c ++:什么是变量的链接和存储说明符?

What is a variable's linkage and storage specifier?

当有人谈论变量存储类说明符时,他们在说什么?
他们还经常在同一上下文中谈论变量链接,那是什么?


存储类说明符控制变量的存储和链接。这是两个不同的概念。
C为变量指定以下说明符:自动,外部,寄存器,静态。

存储
存储期限决定了变量在ram中的生存时间。
有三种存储期限:静态,自动和动态。

静态的
如果变量是在文件范围内声明的,或者使用extern或static声明符声明,则它将具有静态存储空间。该变量将在程序执行期间一直存在。无需花费执行时间来创建这些变量。

自动
如果变量是在函数中声明的,但没有外部或静态说明符,则它将具有自动存储功能。该变量仅在执行函数时存在。返回后,该变量将不再存在。自动存储通常在堆栈上完成。创建这些变量是一个非常快的操作(只需增加堆栈指针的大小即可)。

动态
如果使用malloc(或C ++中的新增功能),则使用动态存储。该存储将一直存在,直到您拨打免费(或删除)电话为止。这是创建存储的最昂贵的方法,因为系统必须动态管理分配和释放。

连锁
链接指定谁可以看到和引用变量。链接有三种类型:内部链接,外部链接和无链接。

没有联系
此变量仅在声明的位置可见。通常适用于在函数中声明的变量。

内部联系
该变量对于文件中的所有功能(称为翻译单元)都是可见的,但其他文件将不知道它的存在。

外部联系
该变量将对其他翻译单元可见。这些通常被认为是"全局变量"。

这是一张根据说明符描述存储和链接特性的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  Storage Class   Function            File
  Specifier        Scope              Scope  
-----------------------------------------------------
  none           automatic         static      
                 no linkage        external linkage

 extern          static            static
                 external linkage  external linkage

 static          static            static
                 no linkage        internal linkage

  auto           automatic         invalid
                 no linkage

register         automatic         invalid
                 no linkage

变量存储类或类型说明符(例如volatile,auto和static)定义了在程序执行期间如何/在何处保存变量。例如,函数中定义的变量通常保存在堆栈中,这意味着在函数返回后它将丢失。使用" static"关键字,可以强制编译器将变量放入内存中的数据段中,使变量内容在对该函数的调用之间保持不变。" register"关键字将导致编译器尽最大努力将变量放入CPU寄存器中,这对于循环中的计数器等很有用。但是,不能保证毕竟它实际上在寄存器中。

在此处阅读有关类型说明符的更多信息。


推荐阅读