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

时间:2010-09-10 12:56:02

标签: objective-c c variables

本地,全局,静态,自动,寄存器,extern,const,volatile变量存储在哪里?

5 个答案:

答案 0 :(得分:57)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:11)

您在寻找答案的抽象级别?

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

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

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

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

相关问题