网搜题目,自己找的答。。。。。。。。。。。。。。。。。。。。。。。。。一直在需要补充的过程中~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
简单介绍一下自己,平常用什么语言
对栈而言,栈中的新加数据项放在其他数据的顶部,移除时你也只能移除最顶部的数据(不能越位获取)。
2.对堆而言,数据项位置没有固定的顺序。你可以以任何顺序插入和删除,因为他们没有“顶部”数据这一概念。
上面上个图片很好的描述了堆和栈分配内存的方式。
2.5堆和栈中的存储内容栈:
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区: 存放全局数据和静态数据以及常量.
3 栈区 函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区,存放程序动态分配的内存(new,malloc等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块
区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是
在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态
区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内
定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
1,什么是栈溢出?
因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。
2,解决方案:
方法一:用栈把递归转换成非递归
通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据,以减少系统负担。
方法二:使用static对象替代nonstatic局部对象
在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。
方法三:增大堆栈大小值
当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。
如果要把某个变量占用的内存保存,怎么解决?
还记得继承和多态的概念吗?都要解释。重载和重写也要解释一下
继承可以理解为XX是一种XX,使用extends关键字实现类的机制,通过继承,子类自动拥有基类
多态就是动态绑定,是指在执行期间,而非编译期间判断所引用的对象的实际类型,根据其实际的类型调用其相应的方法。三个必要条件是:要有继承,要有重写,父类引用指向子类对象
解释虚函数和虚函数表
多态性可分为两类:静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态,动态多态性是通过虚函数实现的。
每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针。
没有虚函数的C++类,是不会有虚函数表的
static关键字,注意不仅要解释静态成员变量,还要解释静态成员函数
1) 静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
静态全局变量的特点:
a. 静态变量(包括静态全局变量和静态局部变量)在全局数据区分配内存;
b. 静态变量,不管静态局部还是静态全局变量只被初始化一次。
c. 未经初始化的静态全局变量会被自动初始化为0或空格。(普通变量即自动变量的值是随机的,除非它被显式初始化)
d. 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见,即其它文件中可以定义相同名称的变量,不会发生冲突
2) 静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量的特点:
a. 该变量在全局数据区分配内存;
b. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
c. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0或空格;
d. 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
3) 静态函数
在函数的返回类型前加上static关键字,则该函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其他文件使用。
堆排序的算法复杂度?快排序算法复杂度?快排过程?其收敛条件是什么?快排是稳定的吗?有可能改造成稳定的吗?
你有一台机器,这个机器的剩余内存只有2兆,电脑上存了20000个float,需要把这些float排序,你会怎么做?
顺便问了一下归并怎么排序?归并复杂度?
假设有一个锅炉,同时有一台测试仪,给锅炉每秒测试一次温度,把温度记录下来,整套设备持续运行若干年,为了安全,这个测量仪必须把这个锅炉曾经到达的1000个最高值记录下来,但测量仪本身内存不是很大没法把所有数值都记下来,如果要你设计一个系统,记录最高的1000值.需要跟已知的数值比较,需要比较多少次?
二分法比较并不科学,首先和上一次的最小值比较
链表,判断是否有环
两个链表,判断是否相交
对搜索引擎有什么了解?
找一个比较典型的项目了解一下
甲、乙两个人背对背坐着,乙面前有4*4的格子,上面有象棋,有正面和背面,规则是:甲可以命令乙进行一次操作。该操作可以是翻转棋子(可以任意翻1颗,也可以翻任意2颗,翻任意3颗的情况和1颗一样不考虑),该操作也可以是旋转棋盘(旋转90°180°270°),但每次只能选择一种操作。
当棋盘上4颗棋子同时在正面,或者同时在背面,则甲赢。
问:最少几次能保证甲一定能赢?
聊一下项目,大项目小项目
说一下一两种你比较熟悉的分类器,比较一下优缺点
遇到内存泄露问题,一般会采取什么过程去找原因,专门针对内存泄露来
栈和堆。静态变量,静态成员函数
在线写程序:对字符串进行处理,字符串里面有连续的空格,写一个函数,去掉多余空格
有一块内存buffer,统计一下多少个二进制的byte是1