zoukankan      html  css  js  c++  java
  • 上海NV面试被虐经历

    WARP 
    随便说说Skip to content

     

    上海NV面试被虐经历

    By  | 2013年8月17日

    职位: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 的要求还是非常高,各位童鞋在代码的时候不光要会写会用,还要思考下原理。
     
     
  • 相关阅读:
    POJ 1320 Street Numbers 解佩尔方程
    数学分支(转)
    深入理解Java类加载器(1):Java类加载原理解析
    Java类加载器的工作原理
    深入理解Java:类加载机制及反射
    类加载机制:全盘负责和双亲委托
    java底层学习
    代码面试最常用的10大算法
    程序员面试金典算法题
    了解ASCII、gb系列、Unicode、UTF-8的区别
  • 原文地址:https://www.cnblogs.com/warpengine/p/3456482.html
Copyright © 2011-2022 走看看