Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 本地、全局、静态、自动、寄存器、外部、常量和易失性变量存储在哪里?_Objective C_C_Variables - Fatal编程技术网

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

Objective c 本地、全局、静态、自动、寄存器、外部、常量和易失性变量存储在哪里?,objective-c,c,variables,Objective C,C,Variables,本地、全局、静态、自动、寄存器、外部、常量、易失性变量存储在哪里?本地变量通常存储在堆栈上,全局变量存储在程序的“文本”段(对于字符串常量)或堆上(如果动态分配)。自动变量通常用于函数/方法,通常在堆栈上传递(有时也在寄存器中,具体取决于体系结构)。寄存器变量曾经存储在寄存器中,但现在大多数编译器忽略了Register关键字,将它们放在它们认为合适的任何地方——堆栈上或寄存器中。Extern、const和volatile成员都是修饰符,因此它们没有明确的存储位置 因此,简短的回答是,像往常一样,

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

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


因此,简短的回答是,像往常一样,“这取决于”。本地和
auto
变量存储在堆栈上。全局变量和
静态变量存储在数据页中<代码>寄存器
变量尽可能存储在CPU上的寄存器中,否则存储在堆栈中
extern
const
volatile
未指定变量的存储位置;变量存储在其他存储说明符指定的位置。

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

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

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

  • auto变量始终是本地变量,并存储在堆栈上

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

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

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

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


这一切适用于C++和Objul-C.</P> < P>你在寻找什么抽象层次?p> 在物理层面上,它们可能都存储在栅极电容和磁畴中。(如果您的交换磁盘连接了wifi或光纤,甚至可能是光子。)

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

给定最熟悉的编译器和运行时实现,内存(可能是虚拟的)被切分为堆栈和堆。给定正式的语言定义,这种切分可能是必需的,也可能不是必需的


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

局部-函数中的作用域的局部变量。它可能是两种类型的自动或静态变量。 如果它只是声明为int var,编译器将其视为自动存储类。 自动变量存储在堆栈中。 静态变量存储在数据段中

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

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


常量变量存储在只读区。只读区是memory的代码段区。

在内存中…?这里的“文本段”是指“数据段”除了谈论常量之外。太好了!+1是一个非常好的答案。如果你在这个上下文中提到堆内存和指针,那就更完美了!文本段通常是只读的。全局变量将在数据段中。+100希望我可以根据需要经常投票,使这成为投票最多的答案:)我最喜欢抽象的部分。