上海NV面试被虐经历
职位:Mobile Graphic Tools Engineer.
这个职位主要对C++要求很高,对OpenGL API 要求很了解,面的很水,本身自己很紧张,对原理了解的也不够多。靠回忆写了点。。
C++:
1.类的初始化列表
这个东西大家都用,也知道能提高效能,但是关于它的原理。。。好吧,看这个:
三种情况下需要使用初始化成员列表:
一,需要初始化的数据成员是对象的情况;
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
对于第一点,当我们的类成员里有个对象,而我们却在构造函数内对它初始化时,一般来说,不仅要调用这个对象的拷贝构造函数,还要进行对象的赋值(比较消耗性能)。比如class A内有:
class B{
int a;
int b;
};
在实例化A的时候,用:
B b;
A(b);
是很耗性能的,可以把A的constructor写成A(int a,int b):B(a,b).
第二点是因为const 对象是不允许赋值操作,只能用初始化列表。
第三点也是一个道理。
2.C++多态实现的原理
这个就是虚函数表。
3.智能指针的原理分类
引用计数,分两类,侵入式和非侵入式,就是 intrusive_ptr 和 shared_ptr。
4. std::vector 的删除函数内部实现,提高效能的算法
vector是连续内存,它的删除函数是通过把后面的元素拷贝到前面实现的,这个我还是大概知道的,然后面试官问了一个如果vector 中用多个重复的要删除的情况,用erase效能是比较低的,因为每删除一次都要把后面的全向前拷贝一次。。。
大概思路就是先遍历,找出重复元素的位置放在一个数组里,然后看每一个元素之前有几个要删除的元素,就向前拷贝几个下标。
还有就是用erase删除的时候如果用迭代器遍历删除记得写成 i it = vec.erase(it); 不然迭代器会失效。
总之用STL的时候还是多思考一下内部原理吧。
图形:
1.Framebuffer 是什么,能挂载的渲染结果有哪些
可以参考FBO的定义了,算是OpenGL里比较常见的技术,FBO 里的 gl_attachment 一般挂载的就是纹理(保存渲染结果或者深度)和RenderBuffer Object(这个东西我忘记了,没答出来)
2.VBO 的原理,VAO 与VBO区别
其实我VBO完全没有使用过,我用的都是Vertex Array + glDrawElements. 所以这题就直接呵呵了,不过其实我还真看过这方面的文章,请看这两篇:
总结一下NV对C++要求和OpenGL API 的要求还是非常高,各位童鞋在代码的时候不光要会写会用,还要思考下原理。