蚂蚁金服C++一二三面面经+HR+口头offer确认
楼主8号内推的蚂蚁,29号面完所有流程,一二面隔的时间有点远了,有些问题记不太清,这里把能想到的都写下来吧。
一面(1小时,P7):
前面10分钟简单聊了下研究方向。后面全程C++。
Q:主要语言是C++是吧,那我们先来考察一下C++的基础。
A: 好的。
Q:C++里是怎么定义常量的?常量存放在内存的哪个位置?
A:常量在C++里的定义就是一个top-level const加上对象类型,常量定义必须初始化。对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。
Q:你刚刚说到了const,const修饰成员函数的目的是什么?
A:const修饰的成员函数表明函数调用不会对对象做出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。
Q:那如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
A:不会,这相当于函数的重载。
Q:C++ 类内可以定义引用数据成员吗?
A:可以,必须通过成员函数初始化列表初始化。
Q:new/delete与malloc/free的区别是什么?
A:首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数。
Q:你博客里提到了隐式类型转换,能简单说说吗?
A:首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。
Q:如何避免?
A:explicit关键字。
Q:说说你了解的类型转换。
A:C++类型转换有四种。(这四种请大家自己去查)
Q:说说reinterpret_cast.
A: 这种是不常用的,可以用于任意类型的指针之间的转换,对转换的结果不做任何保证,可能被用于哈希(此处不确定)。
Q:说说dynamic_cast
A: 这种其实也是不被推荐使用的,更多使用static_cast,dynamic本身只能用于存在虚函数的父子关系的强制类型转换,对于指针,转换失败则返回nullptr,对于引用,转换失败会抛出异常。
Q:说说const_cast
A:事实上的用途还是很普遍的。对于未定义const版本的成员函数,我们通常需要使用const_cast来去除const引用对象的const,完成函数调用。另外一种使用方式,结合static_cast,可以在非const版本的成员函数内添加const,调用完const版本的成员函数后,再使用const_cast去除const限定。
Q:说说你了解的RTTI.
A:运行时类型检查,在C++层面主要体现在dynamic_cast和typeid.
Q:具体是怎么实现的。
A:VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dynamic_cast都会去查询type_info.
Q:你刚刚提到虚函数表,具体是怎样实现运行时多态的。
A:简单来讲,子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的类的对象,在VS中,对象的对象模型的头部存放指向虚函数表的指针,通过该机制实现多态。
Q:C++函数栈空间的最大值 ?
A:默认是1M,不过可以调整。
Q:extern “C” ?
A:C++调用C函数需要extern C,因为C语言没有函数重载。
Q:设计模式了解吗,介绍一下单例模式。
A:C++的实现有两种,一种通过局部静态变量,利用其只初始化一次的特点,返回对象。另外一种,则是定义全局的指针,getInstance判断该指针是否为空,为空时才实例化对象。
Q:你说的第二种就是所谓的懒加载。现在有一个问题,如果并发访问,该怎么做。
A:使用锁机制,防止多次访问。
Q:你的锁是锁住所有的代码吗?
A:是。
Q:这样会多次重复判断是否为空,而每次都会加锁,有什么办法改善?
A:可以这样,第一次判断为空不加锁,若为空,再进行加锁判断是否为空,若为空则生成对象。
Q:你提到了锁机制,那么C++的锁你知道几种。
A:锁包括互斥锁,条件变量,自旋锁和读写锁(后两个没答出来)。
Q:说一说你用到的。
A:生产者消费者问题利用互斥锁和条件变量可以很容易解决,条件变量这里起到了替代信号量的作用。balabala。
Q:C++两种map。
A:unordered_map(哈希表)和map(红黑树)。
Q:红黑树了解吗?
A:只知道本质是一颗BST,插入O(logN)。
Q: 快排的时间复杂度最差是多少?
A:O(N2)
Q:什么时候最差?
A:枢纽元左侧元素都比枢纽元小(不确定)。
Q:稳定排序哪几种?为什么?
A:查课本吧,很简单。
Q:聊聊计算机网络的内容吧,TCP三次握手是怎样的?
A:这部分大家参考相关课本。
Q:为什么两次不可以?
A:服务器端未收到客户端的连接确认,因此必须三次。
Q:四次呢?
A:连接确认后第三次的握手已经包含了客户端数据,不需要四次。
Q:TCP拥塞了解吗。
A:没看。(直接跳过了这部分)。
Q:死锁产生的必要条件?
A: 四个必要条件。
Q:如何预防?
A:-请查书。
Q:最后几个问题,你平时如何提升自己的,在语言方面?
A:一些经典的书籍,会认真去看,同时,也会看一些对语言新特性介绍的书籍,保持敏感。
Q:分别有哪些书?
A:C++ primer,经典的入门书,深入探索C++对象模型,帮助我很好的理解C++的对象模型。effective C++,经典的关于C++进阶的使用经验。effective modern C++:关于C++11/14新特性的深入探讨。
Q:说说C++primer中你觉得感受最深刻的内容。
A:这本书是入门必读,我感觉印象最深刻的就是C++ 11的新特性,比如自动类型推导,lambda,右值引用(这里被打断了)。
Q:现在在看哪些书?
A:正在看的是STL源码剖析。
Q:我的问题问完了,你有什么要问我的吗?
A:对我的面试评价。(C++掌握程度很深)
一面确实太久远了,可能有些东西想不起来。当时全程基本都是C++的内容,稍微穿插了别的领域的问题。
二面(P9):二面非常戏剧性,对大多数人不适用,全程跟面试官讨论了做的研究,面试时间15分钟结束。
三面(P9 交叉):三面的具体过程已经在另一篇帖子了。传送:https://www.nowcoder.com/discuss/70538?type=2&order=0&pos=20&page=1
HR:HR面避免踩坑,主要是一些性格上的问题要小心,其它没什么。
OFFER确认:跟领导讨论实习的工作内容和实习时间。
具体就是这些。楼主准备的内容大都是C++以及算法,但最后面试的过程是基本没有问到算法,语言和研究经历占了很大一部分,总结就是一定要有自己特别擅长的一个方面去打动你的面试官。