English 中文(简体)
为什么C变量储存在特定的存储地点?
原标题:Why C variables stored in specific memory locations?
  • 时间:2012-05-25 06:10:58
  •  标签:
  • c

昨天我接受了一个采访 采访者问我 储存变量的储存类别

我的答案战争:

Local Variables are stored in Stack.       
Register variables are stored in Register
Global & static variables are stored in data segment.  
The memory created dynamically are stored in Heap.

他问我的下一个问题是:为什么它们被存储在这些特定的记忆区? 为什么 当地变量 <%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

那时我一无所知 请帮帮我

最佳回答

C 语言没有定义任何变量的存储位置, 但它确实定义了三种存储类别: 静态、 自动和动态 。

静态变量是在程序初始化期间(在 main () 之前)创建的,在程序终止之前一直存在。 文件范围( Global) 和静态变量属于此类别。 虽然这些变量通常储存在数据部分, 但C标准并不要求这样做, 在某些情况下( 例如, C 口译员) 它们可能储存在其它地点, 如堆积 。

自动变量是在函数体中声明的本地变量。 它们是在程序流到达声明时间或之前创建的, 当它们超出范围时销毁; 这些变量的新实例是为循环函数引用而创建的。 堆叠是执行这些变量的一种 < em> convenient 方式, 但同样不需要。 如果您选择了, 也可以在堆积中安装自动变量, 并且它们通常被放置在登记册中。 在许多情况下, 一个自动变量将在堆叠和堆积的生命周期中移动 。

请注意, register 自动变量注释是一个 int - 汇编者没有义务用它做任何事情,事实上许多现代编纂者完全忽略了它。

最后,动态对象(没有动态变量在C中存在)是指使用 malloc , calloc 或其他类似分配函数明确创建的数值。这些物体在明确创建时就存在,在明确释放时就被销毁。堆积是一个方便放置这些物体的地方,或者根据这种分配方式的能力来定义堆积。但是,编译器的安装是自由的。如果编译器能够进行静态分析以确定一个动态对象的寿命,它也许能够将其移动到数据段或堆叠(然而,很少有C编译器进行这种逃逸分析 )。

这里的关键取自是 C 语言标准只定义了 < em> 多久 < / em > 存在一个给定值。 并且这个寿命的最小期限是这个期限 - 它可能比要求的更长。 如何将它保存在记忆中是一个主题, 语言和图书馆的实施在其中被赋予了相当大的自由 。

问题回答

因为存储区域决定变量的“强度”范围 和“强度”寿命 。

You choose a storage specification depending on your requirement, i.e:
Lifetime: The duration you expect the particular variable needs to be alive and valid.
Scope: The scope(areas) where you expect the variable to be accessible.

简言之,每个储存区提供不同的功能,需要不同的功能,因此储存区不同。

实际上,这仅仅是一个执行细节,是方便的。

汇编者如果愿意,可以在堆积物上产生本地变量,如果他愿意的话。

在堆叠上创建它们比较容易,因为当您离开一个函数时,您可以调整框架指针,根据堆叠的成长方向进行简单的增减,从而自动为下一个函数腾出用过的空位。但是,在堆叠上创建本地人意味着更多的内部管理工作。

另一个点是,不能在堆叠上创建本地变量,如果汇编者认为更合适,并有足够的登记册来这样做,这些变量可以存储在登记册中,仅用于登记册中。

在大多数情况下,本地变量都存储在登记册中,因为当您调用函数时,登记册会被推动并从堆叠中弹出。 它看起来像它们在堆叠中。

实际上不存在登记变量这样的缓冲,因为C中只有一些很少使用的关键词告诉汇编者将它放入登记册。我想大多数汇编者只是忽略了这个关键字。

为什么还要问更多,因为他不确定你是否深刻理解这个话题。 事实上,注册变量几乎堆叠在堆叠上。

在嵌入系统中,我们有不同种类的记忆(只读非挥发性(ROM),读写非挥发性(EPROM、PROM、SRAM、NURAM、闪光、挥发性(RAM)),以便使用,我们也有不同的要求(不能改变,在电力循环后也可以持续,可以改变,在电力循环后也可以持续,可以随时改变)。我们有不同的部分,因为我们必须乐观地将数据需求映射为不同类型的现有记忆。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签