local,global,static,auto,register,extern,const,volatile变量存储在哪里?

存储了local,global,static,auto,register,extern,const,volatile变量的位置在哪里?

  • 局部变量可以存储在堆栈中或数据段中,具体取决于它们是自动还是静态。 (如果未明确指定auto或static,则假定为auto)

  • 全局变量存储在数据段中(除非编译器可以将它们优化掉,参见const)并且从声明点到编译单元末尾具有可见性。

  • 静态变量存储在数据段中(除非编译器可以将它们优化掉),并且从声明点到封闭范围的末尾具有可见性。 非静态的全局变量在其他编译单元中也可见(参见extern)。

  • 自动变量始终是本地的,并存储在堆栈中。

  • 如果可能的话, 寄存器修饰符告诉编译器尽力将变量保存在寄存器中。 否则它存储在堆栈中。

  • 外部变量存储在数据段中。 extern修饰符告诉编译器另一个编译单元实际上是在声明变量,因此不要创建它的另一个实例,否则链接时会发生名称冲突。

  • const变量可以存储在堆栈或只读数据段中,具体取决于它们是自动还是静态。 但是,如果编译器可以确定它们不能从不同的编译单元引用,或者您的代码没有使用const变量的地址,则可以自由地对其进行优化(每个引用可以用常量值替换) 。 在那种情况下,它不会存储在任何地方。

  • volatile修饰符告诉编译器变量的值可能随时从外部影响(通常是硬件)发生变化,所以当引用该变量时,它不应该尝试优化从内存到寄存器的任何重载。 这意味着静态存储。

BTW所有这些都适用于C&C ++以及Objective-C。

你在什么抽象层面寻找答案?

在物理层面,它们都可能存储在栅极电容和磁畴中。 (如果您的交换磁盘是wifi或光纤连接,甚至可能是光子。)

在一个硬件级别,任何和所有这些变量的副本可能存在于寄存器中的多个位置,数据高速缓存(可能在多个级别),主存储器和/或存储层次结构中,从完全交换到磁盘或NV存储的所有内容(取决于任何需求页面虚拟内存子系统的存在,实现和当前状态),如果您的应用程序大小和生命周期足够小,也可能是寄存器中的所有内容。

鉴于最熟悉的编译器和运行时实现,内存(可能是虚拟的)被切割成称为堆栈和堆的东西。 鉴于正式的语言定义,这种斩波可能需要也可能不需要。

在编译器优化级别,许多这些变量可能已经优化不存在。 除了作为抽象之外,它们不会被存储在任何地方。

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

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

所以简短的答案就像往常一样,“它取决于”。

LOCAL-范围在函数中的局部变量。它可以是auto或static两种类型。 如果声明它只是int var.Compiler视为自动存储类。 自动变量存储在Stack中。 静态变量存储在数据段中。

寄存器变量存储在CPU中。如果没有寄存器可用于存储变量,则编译器将其视为自动变量。

全局变量存储在数据段区域中。

const变量存储在Read Only Area中。这是memeory的Code Segment区域。