【问题标题】:What is a variable's linkage and storage specifier?什么是变量的链接和存储说明符?
【发布时间】:2010-09-10 21:17:27
【问题描述】:

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

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    存储类说明符控制变量的存储链接。这是两个不同的概念。 C 为变量指定以下说明符:auto、extern、register、static。

    存储
    存储持续时间决定了您的变量将在 ram 中存在多长时间。
    存储时长分为三种类型:静态、自动和动态。

    静态
    如果您的变量是在文件范围内声明的,或者使用 extern 或 static 说明符,它将具有静态存储。只要程序正在执行,该变量就会存在。创建这些变量不会花费任何执行时间。

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

    动态
    如果您使用 malloc(或 C++ 中的新功能),则您使用的是动态存储。在您调用 free(或删除)之前,此存储将一直存在。这是创建存储最昂贵的方式,因为系统必须动态管理分配和解除分配。

    联动
    链接指定谁可以查看和引用该变量。联动分为内联动、外联动和无联动三种。

    没有链接
    这个变量只在它被声明的地方可见。通常适用于在函数中声明的变量。

    内部链接
    该变量将对文件中的所有函数可见(称为translation unit),但其他文件将不知道它的存在。

    外部链接
    该变量将对其他翻译单元可见。这些通常被认为是“全局变量”。

    这是一个基于说明符描述存储和链接特征的表格

    存储类函数文件 说明符作用域 -------------------------------------------------- --- 无自动静态 无联动 外联动 外部静态静态 外联 外联 静静静静 无联动内联动 auto 自动无效 无联动 注册自动无效 无联动

    【讨论】:

    • 可能应该包含一些关于翻译单元的额外细节,因为它们不仅仅是文件......它们是源文件以及其中包含的任何标题(但间接地)
    • 哇... +1。请注意,“auto”将使用 C++0x 改变其含义:en.wikipedia.org/wiki/C%2B%2B0x
    • c++11 更新:线程存储持续时间。对象在线程开始时分配,在线程结束时释放。每个线程都有自己的对象实例。只有声明为 thread_local 的对象具有此存储持续时间。 thread_local 可以与 static 或 extern 一起出现来调整链接。
    【解决方案2】:

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

    阅读更多关于类型说明符here

    【讨论】:

    • 对于“尽可能努力”的奇怪定义,通常意味着“什么都不做”。 register 已完全过时,除非(通过强制执行)您的代码不允许使用变量的地址。
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多