C语言 本地变量、全局变量、静态变量、自动变量、寄存器变量、外部变量、常量变量和易失性变量存储在哪里?

zpf6vheq  于 2022-12-03  发布在  其他
关注(0)|答案(5)|浏览(178)

本地变量、全局变量、静态变量、自动变量、寄存器变量、外部变量、常量变量和易失性变量存储在哪里?

pgky5nke

pgky5nke1#

*局部变量可以存储在堆栈或数据段中,具体取决于它们是auto还是static。(如果auto或static都没有明确指定,则假定为auto)
*全局变量存储在一个数据段中(除非编译器可以将其优化掉,请参见const),并且从声明点到编译单元末尾都具有可见性。
*static变量存储在一个数据段中(同样,除非编译器可以优化它们),并且从声明点到封闭作用域的末尾都是可见的。非static的全局变量在其他编译单元中也是可见的(参见extern)。
*auto变量始终是局部变量,并存储在堆栈上。

  • 修饰符告诉编译器尽可能的将变量保存在寄存器中,否则它就被存储在堆栈中。
    *extern变量存储在数据段中。extern修饰符告诉编译器,不同的编译单元实际上正在声明该变量,因此不要创建它的另一个示例,否则在链接时会发生名称冲突。
    *const变量可以存储在堆栈或只读数据段中,具体取决于它们是auto还是static。但是,如果编译器可以确定不能从其他编译单元引用它们,或者代码没有使用const变量的地址,它可以自由地将其优化掉(每个引用都可以用常量值替换)。在这种情况下,它不会存储在任何地方。
  • 修饰符告诉编译器一个变量的值可能在任何时候由于外部影响(通常是硬件)而改变,所以当引用这个变量时,它不应该试图优化掉从内存到寄存器的任何重载。2这意味着静态存储。

顺便说一句,所有这些都适用于C & C++以及Objective-C。

dzjeubhm

dzjeubhm2#

您在什么抽象层次上寻找答案?
在物理层面上,它们可能都存储在门电容和磁畴中(如果你的交换盘连接了Wi-Fi或光纤,甚至可能是光子)。
在一个硬件级别上,任何和所有这些变量的副本可以存在于寄存器、数据高速缓存(可能在多个级别)、主内存和/或存储层次结构,从完全换出到磁盘或non-volatile memory存储的所有内容(取决于任何请求分页虚拟存储器子系统的存在、实现和当前状态),如果应用程序的大小和生存期足够小的话,可能会扩展到寄存器中的所有内容。
给定最熟悉的编译器和运行时实现,内存(可能是虚拟的)被分割成称为堆栈和堆的东西。给定形式语言定义,这种分割可能需要,也可能不需要。
在编译器优化级别上,许多变量可能已经被优化过了,它们除了作为一个抽象之外,不会存储在任何地方。

8nuwlpux

8nuwlpux3#

局部变量和auto存储在堆栈中。全局变量和static存储在DATA页面中。如果可能,register变量存储在CPU上的寄存器中,否则存储在堆栈中。externconstvolatile不指定变量存储的位置;变量存储在其他存储说明符指定的位置。

xqkwcwgp

xqkwcwgp4#

局部变量通常存储在堆栈中,全局变量存储在程序的“文本”段中(在字符串常量的情况下)或者如果它们是动态分配的,则在堆上。自动变量通常用在函数/方法中,并且通常在堆栈上传递(有时也在寄存器中,这取决于体系结构)。寄存器变量曾经存储在寄存器中,但是现在大多数编译器都忽略了register关键字,而是把它们放在它们认为合适的地方--堆栈上或寄存器中。Extern、const和volatile成员是修饰符,因此没有明确的存储位置。
所以简短的回答是,和往常一样,“看情况而定”。

j7dteeu8

j7dteeu85#

本地

作用域在函数内的局部变量。可能有两种类型,autostatic
如果它被简单地声明为int var,编译器会把它当作 auto 存储类。auto变量存储在堆栈中。
静态变量存储在 * 数据段 * 中。
寄存器变量存储在CPU中。如果没有寄存器可用于存储变量,则编译器将其视为自动变量。
全局变量存储在 * 数据段 * 区域中。
常量变量存储在 * 只读区 * 中,即内存的 * 代码段 * 区域。

相关问题