微软IEG即创新工程组,是MSRA下面的一个部门,主要侧重于新的研究在产品上的落地。是一个侧重工程开发而不是算法研究的部门。据说程序员界的名人轮子哥和刘未鹏都在这个部门。这个面试是今年8月份面的,形式为电话面试,最后遗憾未能通过,特记录下面试题如下。
注:由于是内推实习面试,因此内容肯定是会比校招容易的,仅供参考。
微软打电话是出其不意的,下午还在外面浪的时候,来了一个010开头的电话:“喂,这里是微软亚洲研究院,我们收到了你的简历,请问你现在是否有时间做一个简单的面试?”此时我完全没有准备,因此推说今天有事,约了第二天中午1点面试。
第二天中午1点电话准时打来,开始面试:
问题1:我看到你简历上内容比较丰富,项目也很多,请你介绍一个印象最深的项目,你在其中做了什么?
问题分析:这个问题也属于面试最容易被问到的问题之一了,我在这个问题上答的非常不好,直接影响了后面的面试。由于我本科毕业后先在华为工作过三年,之后又来读研,简历上无重点的罗列了很多项目,也没有写清楚自己具体做的什么,这样无法有目的的引导面试官提问,自己也无法针对性的准备,最后只能坑自己。我的感想是首先简历上要突出重点,有些技术含量不高的小项目是减分项,该删的就要删。另外做完每个项目也要及时总结,这样才能很好的应对此类问题。如果此类问题答不好,甚至会怀疑简历的真实性,非常糟糕。
问题2:我看你简历上写C++比较熟,介绍一下栈内存和堆内存?
问题分析:常考题了,介绍了一下有静态存储区、栈区、堆区几种分配方式,全局变量和静态变量是在静态存储区,栈内存包括函数的形参、局部变量、返回值等,由系统自动分配释放,程序员不能操纵。内存比较有限,分配过大局部变量可能栈溢出。堆内存是由程序员使用malloc或new手动分配的(malloc和new的区别也是常考题),分配后要手动释放否则会内存泄漏。
问题3:我看你做了一个C#项目,你来讲下C#和C++的区别?
问题分析:微软IEG有很多工作是用C#写的,问这个问题也是看我能不能直接上手吧,毕竟做过C#开发的人还是比较少的。遗憾的是由于我当时项目做完就做完了,没有总结思考,这个题目没答出来。只说到了C#对C++进行化繁为简,去掉了很多繁杂的特性,而加入了一些java的特性,比如反射,但是细节就说不出来了。现总结如下:
C#是一门托管语言,对C++进行了比较多的修改并增加了一些新特性如装箱拆箱,垃圾回收,反射等。细节上的区别包括:1、C#无需由程序员删除堆内存,而是有一个垃圾收集器,周期性的清空无用内存。2、C#中的String是常量(类似java),每次修改时都会重新构建对象赋值,对于经常修改的对象建议使用StringBuilder等等。
由于C#这门语言用的不多,除了面微软,可能一般问不到。不过这个问题提示我对于语言的特性要深入挖掘,不能浅尝辄止。
问题4:函数返回时什么情况下会内存泄漏,返回string对象时为何没问题?
这个题目涉及C++的构造函数和拷贝构造。函数不能返回局部对象的引用/指针。string是一个局部对象,按理说,在函数作用域结束时会调用析构函数进行析构,但在C++中返回对象时会隐式调用一次拷贝构造函数(其实局部变量还是析构了),因此没问题。
延伸问题:1、什么时候调用复制构造函数呢?我总结有3种情况:显式一种,隐式两种(一是在调用函数传参时对形参对象进行拷贝构造,二是在函数中返回对象时调用一次拷贝构造函数。)
2、为什么拷贝构造函数只能传引用不能传值:《剑指offer》上原题,会造成递归调用从而导致栈溢出
3、函数是否可以返回char *和char数组:答:char *可以返回,char数组不能返回