嵌入式软件的面试重要区分点
举例说明static的三种用途:对应的解释
- 隐藏。当我们同时编译多个文件时,所有未加static的全局变量和函数都具有全局可见性。为了防止出错,需加上static。
- 保持变量的内容持久。.存储在数据区的变量,和全局便量具有相同的性质:生命周期和程序一样长,不会被释放,唯一不同的是变量的作用域有一定的区别。
- 默认初始换为0.当变量未初始化时,加上static可以让系统自动给该变量一个0的值。
举例说明关键字volatile的三种作用:对应解释(易变得)
- 在C语言有关书上写的有关volatile。简单的说:volatile关键字会影响编译器编译的结果,用volatile声明的变量表示该变量随时都可以发生变化,该变量的有关运算,不要进行编译优化,以免出错。
- 1)中断服务程序中修改的供其它程序检测的变量,需要加volatile;
- 2)多任务环境下多任务间共享的标志,应加volatile;
- 3)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
堆与栈有何区别? 对应的大佬解释
- 1)数据结构的堆与栈
①栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。
②堆则是一种经过排序的树形数据结构,常用来实现优先队列等。堆是一种特殊的完全二叉树。 其中,节点是从左到右填满的,并且最后一层的树叶都在最左边(即如果一个节点没有左儿子,那么它一定没有右儿子);每个节点的值都小于(或者都大于)其子节点的值。 - 2)内存内容分配的堆与栈
①分配与释放方式不同
⑴栈内存是由编译器自动分配与释放的,它有两种分配方式:静态分配和动态分配。
⑵堆内存完全是由程序员手动申请与释放的。(malloc函数等)
②分配碎片的问题
⑴对堆来说,内存空间的不连续。 频繁分配和释放(malloc / free)不同大小的堆空间势必会造成,从而造成大量碎片,导致程序效率降低;
⑵对栈来讲,内存空间是连续,则不会存在这个问题。
③分配的效率
⑴栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。栈的分配效率要高一些。
⑵堆则不同,它是由 C/C++ 函数库提供的,它的机制也相当复杂。堆的分配效率要低一些。
④申请的大小限制 : 堆的生长方向
⑴堆内存的申请大小受限于计算机系统中有效的虚拟内存。栈的增长方向是由高地址向低地址方向增长。
⑵栈则不同,它是一块连续的内存区域,其地址的增长方向是向下进行的,向内存地址减小的方向增长。
⑤存储的内容
⑴对栈而言,一般用于存放函数的参数与局部变量等。
⑵对堆而言,具体存储内容由程序员根据需要决定存储数据。
Little Endian和Big Endian有何区别? 对应的解
大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节保存在内存的高地址中。
小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节保存在内存的低地址中。