题一,堆和栈的区别是?

题二,Volatile与Register的区别是?

题三,ARM里的大端格式和小端格式分别是什么意思?

题一答案:

(1)存储内容不同

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

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

(2)管理方式上不同

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

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

(3)空间大小不同

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

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

(4)能否产生碎片不同

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

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

(5)生长方向不同

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

堆: 向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表空闲内存地址来存储的,自然不连续,而链表的遍历方向是由低地址向高地址。

(6)分配方式不同

栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由malloc函数实现,由编译器进行释放。

堆: 都是动态分配的,没有静态分配的堆。

(7)分配效率不同

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

堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

题二答案:

a.volatile

volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对特殊地址的稳定访问。那么什么是编译器优化呢?

为了提高运行效率,攻城师们费尽心机地把代码优化,优化程序运行时存取速度。一般,分为硬件优化和软件优化。硬件优化,流水线工作,详细可以参考《计算机组成原理》。软件优化,一部分是程序猿们做的代码优化(前提你得有优化的思路和能力),还有一部分就是我们的编译器优化了。

现代的编译器经过那么多年的发展,已经比较成熟,它会把多余的变量忽略掉,让代码的运行效率更高。默认情况下,编译器都会对代码进行优化,会把一些变量在寄存器里存取,而不是在内存里存取,如此一来,CPU在自己家里拿东西当然比从内存那里拿东西要快得多。举个小栗子:

int i = 5;

int a = i;

……

int b = i;

编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读取。

而volatile关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中取出它的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用,而不是从寄存器或者缓存中读取,从而保证了对特殊地址的稳定访问。

简言之,状态要经常变化的,为了防止我们编译优化而导致的存取的数据不同步的问题,这时我们就需要用到volatile。那具体到什么场景下需要用到volatile关键字呢?

1、并行设备的硬件寄存器(如:状态寄存器);

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

3、多线程应用中被几个任务共享的变量;

上面提到了非自动变量,这里进一步对几种变量做一番解释:

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

非自动变量:有两种,一种是全局变量,一种是静态变量。

全局变量:在函数外面定义的变量,只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,需要extern来声明这个变量(也可省略,因为默认就是extern),这个声明叫做引用声明。

若不想被其他文件访问,则用static关键字声明为静态变量。静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。

而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。

如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量,自动变量离开函数后就会被销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。

b. register

这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧。

题三答案:

当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题, 于是端(endian)的问题应运而生了, 对于不同的存储方法, 就有大端(big-endian)和小端(little- endian)两个描述。

字节排序按分为大端和小端,概念如下

大端(big endian): 低地址存放高有效字节

小端(little endian): 低字节存放低有效字节

现在主流的CPU, intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian,ARM则同时支持 big和little。

举个例子

int a = 0x12345678;

a是四字节的int类型变量,需要占四个字节空间,假设变量a的首地址是0x2000,那么数据存储在地址中的格式如下:

---------end-------

面试加试c语言_经典面试题目C语言相关推荐

  1. 面试技巧:16个经典面试问题回答思路

    今天有家里的小弟快要大学毕业了,问我怎么去面试的?想想自己已经有好多年没有面试的经历了.再说自己本来跳槽不多,面试经历的也不多,所以也没有敢说出什么建议来.但看到下面的篇内容,觉的不错,就推荐给小弟去 ...

  2. 面试题目_经典面试题目「回溯算法」解数独

    解数独,理解二维递归是关键! 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家 ...

  3. c语言程序设计顺序结构题目,C语言编程 顺序结构编程练习题目

    C语言顺序结构编程练习题目 C语言编程 顺序结构题目 题目1计算摄氏温度 输入一个华氏温度,要求输出摄氏温度.公式为:C=5/9(F-32),输出要有文字说明,取2位小数. 式中:C表示摄氏温度,F表 ...

  4. c语言编程思想的题目,c语言方面毕业设计选题范文.docx

    c语言方面毕业设计选题范文 c语言方面毕业设计选题 篇一:C语言课程设计选题 C语言课程设计 一.设计要求与设计报告 设计要求 1.任意选定以下一个题目,限3人选的题目可由1-3人完成(用*表示) 2 ...

  5. c语言 电报翻译的题目,C语言程序设计实训题目.doc

    C语言程序设计实训题目.doc C语言程序课程设计题目题目1年历显示功能要求(1) 输入一个年份,输出是在屏幕上显示该年的日历.假定输入的年份在1940-2040年之间.(2) 输入年月,输出该月的日 ...

  6. 为什么要学python语言_我们为什么要学习Python语言?

    原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...

  7. 更改计算机语言win7,windows7专业版怎么更改语言_如何更改windows7专业版语言

    我们都知道,系统版本是有多种语言设置的,这样也方便了各种人群的使用,可是win7专业版却没有转换语言的相关权限,其实这只是没有安装自动化安装的软件,或者由于系统原因被禁止了,那么win7专业版应该怎么 ...

  8. enum c++语言_第三章 C语言关键字

    了解C语言的关键字有哪些: 一.C语言的标准关键字 标准C语言共有32个关键字,9种控制语句,程序书写形式自由,区分大小写.把高级语言的基本结构和语句与低级语言的实用性结合起来. 32个关键字 二.每 ...

  9. c++软件开发面试旋极面试题_经典软件开发面试题:浏览器中输入一个网址后发生了什么?...

    经典软件开发面试题:浏览器中输入一个网址后发生了什么? ​ 大家好, 这一期呢,我们来谈一个经典的面试题.这种题目是在浏览器中输入一个网址以后, 会显示一个网页,这期间到底发生了什么? 答案要求说的越 ...

最新文章

  1. 【暴力】UVALive - 4882 - Parenthesis
  2. php mysqli还原数据库,PHP mysqli操作数据库
  3. Python的matplotlib—绘图(3)
  4. C#.NET常见问题(FAQ)-Combobox如何设置不可以编辑
  5. C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set
  6. c语言格式化输入字符型,C语言——字符串和格式化输入/输出
  7. Angular module加载的原理研究
  8. (王道408考研操作系统)第三章内存管理-第一节3:覆盖与交换
  9. flutter UiKitView 加载ios 原生view
  10. 在C#中什么时候用分号?
  11. 前端MVC学习笔记第二课
  12. MyBatis学习--查询缓存
  13. 3dmax材质丢失插件_3dmax找回材质插件怎么用
  14. 悉尼大学计算机研究生学制,悉尼大学研究生一般读几年?九大领域研究生学制盘点!...
  15. 浏览器如何禁用或启用Cookie
  16. 别让我们的幸福感受在别人眼中
  17. 仓管员的个人年终总结pos维护调度年终总结
  18. LeetCode_575_分糖果
  19. 将 Jar 包打成一个 Jar 包
  20. mysql数据库一些常用操作

热门文章

  1. 20款漂亮的免费英文字体下载
  2. 动手学深度学习实现DAY-2
  3. 一学年的竞赛总结和回顾【我参加过的那些竞赛】
  4. ZZ:INF文件中的注册表位置,譬如HKCR、HKLM、HKR等
  5. 调试 BQ25892 I2C通讯
  6. 深度学习真的working吗
  7. c++_-nan(ind) NAN
  8. 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索
  9. View类的setVisibility()
  10. 【Dart 教程系列第 21 篇】Dart 之 firstWhere 返回数组中第一个满足条件的元素