百度2面
1.项目中写的对外的接口都有什么?
2.项目里你觉得皮肤引擎是怎么实现的?
3.map<key,value>还有其他的参数么?比如当key是一个自定义的类的时候,是怎么处理的?
答:map<key,value,cmp> cmp是一个仿函数,定义的是key的比较规则,比如当key是一个结构体或一个类的时候,无法直接比较出key的大小,此时实现一个key比较大小的仿函数。
4.多线程编程熟悉吗?说一说critical section和mutex 的区别
答:
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. vector中swap函数是怎么实现的?为什么会达到如此高效?
答:
vector中的源码如上,vector的swap在进行调用的时候并没有进行元素的内存拷贝,而是交换两个vector的指针属性。让a的所有指针指向b,让b的所有指针指向a即可。十分高效。
补充知识:vector不用调用者判断访问越界,内部实现了assert()【注意,assert仅仅在debug的时候才有效,故在release中依然不会判断访问越界】,而数组需要判断。
例如:
vector<int> v; v.push_back(1); v.push_back(2); cout<<v[2]<<endl;//越界了
int a[2]; a[0]=1; a[1]=2; cout<<a[2]<<endl;
6.我们知道,vector中clear函数只是将所分配空间size()置0,以便新来的元素覆盖原来的元素,但是内存并没有真正释放,capacity依然不变(这样做是考虑到新的元素数量可能依然会达到该数量级的容量大小,因此保留内存容量不变以避免重新分配带来的性能降低。重新分配会大大降低性能——容器未满,直接插到末端,容器不够,找合适内存扩容2倍,然后依次将原数据复制。)那么,有什么方法可以达到正真释放内存容量呢?
答:vector<int>().swap(v);//申明一个capacity为0的临时变量(此处为无名变量),然后交换空间,当临时变量出了作用域后,就自动释放内存空间了。
注意:当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.****.net/theone10211024/article/details/13625071
9.平时都看什么样的书籍?
- 1楼zgtjwyftc4天前 16:44
- 这就是拿百度offer的节奏啊,膜拜+跪舔
- Re: THEONE102110244天前 17:06
- 回复zgtjwyftcn那我去洗个脚