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

Mat*_*rix 29 c variables objective-c

存储了本地,全局,静态,自动,寄存器,extern,const,volatile变量的位置?

Fer*_*cio 62

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

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

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

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

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

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

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

  • 挥发性改性剂告诉一个变量的值可以在改变它的编译器随时从外部影响(通常是硬件),因此它不应该尝试时变量被引用到从存储器优化掉任何重新加载到寄存器中.这意味着静态存储.

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


hot*_*aw2 11

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

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

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

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

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


Ign*_*ams 5

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