百度二面

1.项目中写的对外的接口都有什么?

2.项目里你觉得皮肤引擎是怎么实现的?

 

3.map还有其他的参数么?比如当key是一个自定义的类的时候,是怎么处理的?

 答:map cmp是一个仿函数,定义的是key的比较规则,比如当key是一个结构体或一个类的时候,无法直接比较出key的大小,此时实现一个key比较大小的仿函数。

 

4.多线程编程熟悉吗?说一说critical sectionmutex 的区别

  答:

  1).锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section需要花费几乎100被的时间。因为critical section不需要进入操作系统核心。

  2).mutexs可以跨进程使用,critical section则只能够在同一进程中使用。

  3).等待一个mutex时,你可以指定“结束等待”的时间长度。

  4).CRITICAL_SECTION不是核心对象。

以下是两种对象的相关函数比较:

 CRITICAL_SECTION                                          Mutex核心对象

 InitializeCriticalSection()                                    CreateMutex()

                                                                                OpenMutex()

 EnterCriticalSection()                                         WaitForSingleObject()

                                                                                WaitForMultipleObject()

                                                                                MsgWaitForMultipleObject()

 LeaveCriticalSection()                                       ReleaseMutex()

 DeleteCriticalSection()                                      CloseHandle()

5. vectorswap函数是怎么实现的?为什么会达到如此高效?

  答:

vector中的源码如上,vector的swap在进行调用的时候并没有进行元素的内存拷贝,而是交换两个vector的指针属性。让a的所有指针指向b,让b的所有指针指向a即可。十分高效。

补充知识:vector不用调用者判断访问越界,内部实现了assert()【注意,assert仅仅在debug的时候才有效,故在release中依然不会判断访问越界】,而数组需要判断。

例如:

vector v;
v.push_back(1);
v.push_back(2);
cout<
百度二面_第1张图片

int a[2];
a[0]=1;
a[1]=2;
cout<
百度二面_第2张图片

6.我们知道,vectorclear函数只是将所分配空间size()0,以便新来的元素覆盖原来的元素,但是内存并没有真正释放,capacity依然不变(这样做是考虑到新的元素数量可能依然会达到该数量级的容量大小,因此保留内存容量不变以避免重新分配带来的性能降低。重新分配会大大降低性能——容器未满,直接插到末端,容器不够,找合适内存扩容2倍,然后依次将原数据复制。)那么,有什么方法可以达到正真释放内存容量呢?

 答:vector().swap(v);//申明一个capacity0的临时变量(此处为无名变量),然后交换空间,当临时变量出了作用域后,就自动释放内存空间了。

  注意:当vector中存的是对象的时候,在释放的时候会自动调用对象的析构函数释放内存空间,但是当vector中是指向一片内存的指针的时候,就必须先遍历vector,逐个手动释放指针指向的内存空间(比如调用free(p)或者当p内也有指向其他内存的指针的时候,最好在p对象内实现一个destroy函数,然后p->destory(),这样就把内存释放的干干净净了)。

 

7.设计模式中的适配器模式是什么?

 

8.IUnKonwn接口都有哪些?其中里面的QueryInterface()函数怎么实现的?

  

   #define interface class
 interface IUnKnown
{
virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0;
virtual ULONG __stdcall AddRef()=0;
virtual ULONG __stdcall Release()=0;
}

实现参见:http://blog.csdn.net/theone10211024/article/details/13625071

9.平时都看什么样的书籍? 

你可能感兴趣的:(笔试面试)