您的位置:首页 > 其它

百度二面

2013-10-30 14:14 288 查看
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;
}


实现参见:/article/2636899.html

9.平时都看什么样的书籍?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: