嵌入式之经典知识点(一)

1.堆(Heap)和栈(Stack)有什么区别?

(1)存储内容不同:

栈:在函数调用时,栈中存放的是函数的中各个参数(局部变量)。栈中最下面的指令是函数调用后的下一条指令。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的内容由程序员分配。

(2)管理方式不同

栈:由系统自动分配并释放空间,例如,在函数中声明一个局部变量 int a; 系统自动在栈中为a开辟空间,当对应的生存周期结束后栈空间被自动释放。

堆:需要程序员指定大小申请和手动释放,在C语言中使用malloc函数申请,使用free释放

(3)空间大小不同

栈:获取的空间较小,在windows下一般大小是1M或者2M。当剩余的栈空间不足时,分配失败overflow。

堆:获得的空间根据系统的有效虚拟内存有关,比较灵活和大。

(4)碎片问题

栈:不会产生碎片,空间连续。

堆:采用链表的存储方式,会产生碎片。

(5)生长方向不同

栈:向低地址扩展的数据结构,是一块连续的内存区域。

堆:向高地址扩展的数据结构,是不连续的内存区域。这是因为堆采用链表的空闲的内存地址来存储的,所以不连续。而链表的遍历方向为高地址向低地址。

(6)分配方式不同

栈:分为静态分配和动态分配,静态分配由编译器完成,如局部变量。动态由malloc函数实现,由编译器进行释放。

堆:都是动态分配。

(7)分配效率不同

栈:由系统自动分配,速度较快,但程序员无法控制。

堆:由new来分配内存,速度慢。

 

Volatile和Register的区别?

1.volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符。遇到这个关键字,编译器对访问该变量的代码不进行优化,从而对特殊地址进行稳定的访问。

2.编译器优化的概念:默认情况下,编译器会对代码进行优化,会把一些变量放在寄存器中读取,而不是每次都从内存读取。

例如

int a=6;
int b=a;
int c=a;

编译器发现两次从a读取数据中,a都没有被操做过,所以编译器把a放入寄存器中,提高执行效率。

需要用到volatile的场景: 

1.并行设备的硬件寄存器(状态寄存器)

2.一个中断服务子程序会访问到的非自动变量();

3.多线程任务中被几个任务共享的变量

自动变量:

在函数内部定义和使用的变量,它是局部变量。

非自动变量:

有两种,一种是全局变量,一种是静态变量。

全局变量:在函数外部定义的变量,其他文件想要这个引用这个变量,需要用extern来声明这个变量(不加也可以,缺省为extern)。如果不想被其他文件访问,则用static关键字,则为静态变量。static除了可以不被其他文件来访问,同时它的生存期为整个程序,方便存储数据。

Register:

这个关键字请求编译器尽可能把变量存储在寄存器中.(是尽可能)

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81081774