1) 以下程序的abcLen=? 程序有什么问题?
struct ABC
{
int aa;
int bb;
char cc[0];
};
ABC abc;
int abcLen=sizeof(abc); //abcLen=?
abc.aa=11;
abc.bb=12;
memcpy(abc.cc,"aaaa",5);
答案:
abcLen=8; cc的数据长度为0不占用空间,但是如果struct ABC里面只有char cc[0],那么sizeof(abc)=1;就好像struct ABC{}; 一样,sizeof(abc)也为1;
memcpy(abc.cc,"aaaa",5); //能够得到正确的答案,但是存在abc.cc内存越界问题;一般我们在编程中也经常也这样使用,特别是在协议扩展的时候,这样使用特别方便,但是记得一定要首先为ABC aac 这个对象new 一段内存,用来保存cc地址开始的内容。
2)编写下面函数的赋值操作
class A
{
private:
char *ptr;
}
答案:
一般默认的赋值操作符是浅拷贝,而因为有消息缓存指针的变量,当这个消息类有两个对象时,如果一个消息赋值给另外一个消息,则会涉及到深拷贝的问题,所以要重新定义赋值操作符。
赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。
CTemp a(b); //复制构造函数,C++风格的初始化
CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样
在这之前a不存在,或者说还未构造好。
CTemp a;
a=b; //赋值运算符
在这之前a已经通过默认构造函数构造完成。
3)写出下面类D的内存布局
class A{
public:
virtual aa()=0;
};
class B
{
public :
virtual bb();
protected:
int m_bb;
};
class C:public B
{
public:
virtual cc();
private:
int m_cc;
};
class D:public B,public C
{
public:
virtual dd();
private:
int m_dd;
};
4)写一个线程池,实现多个任务的调度;
5)MFC子类化,怎么理解,内存DC和兼容的DC有什么区别?
6)socket模型,select模型和完成端口模型的区别,各有什么好处?
7)SQL 语句:查询某张表中不重复的最上面的10条记录;
8)ddraw 离屏表面的原理?
9)H264打包和解包流程,Rtp over tcp和Rtp over udp,怎么设计?
10)使用过哪些设计模式,在NVR SDK如何架构?
11)STL ,两个vector向量,如何根据自定义的规则进行排序?
答案:泛型算法的sort函数?
12)http协议的Get和post有什么区别,使用过onvif协议吗?