您的位置 首页 解答

单片机全局变量 局部变量 堆与栈 的差异

单片机全局变量局部变量堆与栈的区别局部变量空间,就是堆栈空间,也就是栈空间。从局部变量声明的时候,它就在堆栈空间了,而不是调

单片机大局变量 局部变量 堆与栈 的差异

局部变量空间,便是仓库空间,也便是栈空间。

从局部变量声明的时分,它就在仓库空间了,而不是调用函数的时分,才让它入栈的。

界说一个局部变量a,编译器会将a的地址分配到寄存器组R0~R7中去。由于它是局部变量,所以编译器将运用当即数赋值句子为代表a的寄存器Rn赋值,最终核算的成果也将存在寄存器组中,方位由编译器恣意指定。

界说一个大局变量a,编译器将在RAM中为变量a指定一个专用地址,在C程序中给a赋的值将存入这个专用地址中。程序操作变量a时,首要从专用地址中取出寄存的值,然后再进行核算。

定论:

局部变量由于用寄存器直接操作,存取速度和核算速度都很快;由于寄存器数量有限,假如局部变量过多,将使代码由于频频分配寄存器而变得冗长。

大局变量被界说在内存中的专门地址上,存取方位固定。关于频频存取的重要变量能够选用大局变量以削减代码的长度;由于大局变量总是占用内存,假如过多,或许把程序处理和核算中的一些中心变量也界说成大局变量,将很多耗费内存空间,处理速度会减慢,一起数据安全性也会下降。

触摸过编程的人都知道,高档言语都能经过变量名来访问内存中的数据。那么这些变量在内存中是怎么寄存的呢?程序又是怎么运用这些变量的呢?下面就会对此进行深化的评论。下文中的C言语代码如没有特别声明,默许都运用VC编译的release版。

首要,来了解一下 C 言语的变量是怎么在内存分部的。C言语有大局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方法。先来看下面这段代码:

#include

int g1=0, g2=0, g3=0;

int main()

{

static int s1=0, s2=0, s3=0;

int v1=0, v2=0, v3=0;

//打印出各个变量的内存地址

printf(“0xx”,&v1); //打印各本地变量的内存地址

printf(“0xx”,&v2);

printf(“0xx”,&v3);

printf(“0xx”,&g1); //打印各大局变量的内存地址

printf(“0xx”,&g2);

printf(“0xx”,&g3);

printf(“0xx”,&s1); //打印各静态变量的内存地址

printf(“0xx”,&s2);

printf(“0xx”,&s3);

return 0;

}

编译后的履行成果是:

0x0012ff78

0x0012ff7c

0x0012ff80

0x004068d0

0x004068d4

0x004068d8

0x004068dc

0x004068e0

0x004068e4

输 出的成果便是变量的内存地址。其间v1,v2,v3是本地变量,g1,g2,g3是大局变量,s1,s2,s3是静态变量。你能够看到这些变量在内存是连 续散布的,可是本地变量和大局变量分配的内存地址差了十万八千里,而大局变量和静态变量分配的内存是接连的。这是由于本地变量和大局/静态变量是分配在不 同类型的内存区域中的成果。关于一个进程的内存空间而言,能够在逻辑上分红3个部份:代码区,静态数据区和动态数据区。动态数据区一般便是“仓库”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程尽管 代码相同,但本地变量的数据都是互不搅扰。一个仓库能够经过“基地址”和“栈顶”地址来描绘。大局变量和静态变量分配在静态数据区,本地变量分配在动态数 据区,即仓库中。程序经过仓库的基地址和偏移量来访问本地变量。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/318941.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部