深信服历年笔试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.. release版本的可执行程序为什么非常大?
程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用
Release和Debug有什么不同
Release版称为发行版,Debug版称为调试版。
Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。
Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL 文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。
sizeof(d)? 为什么在不同的平台上得到的值不一样?
C++拷贝构造函数和赋值运算符有那些不同和相同点。
拷贝构造函数和赋值号的异同
同:都可以对对象的成员进行赋值
异:
拷贝构造函数首先是一个构造函数,它调用的时候产生一个对象,是通过参数传进来的那个对象来初始化,产生的对象。
赋值是把一个对象赋值给一个原有的对象,而且还要检查一下两个对象是不是同一个对象,如果是的话就不做任何操作。
软件开发过程包含哪些阶段?各阶段质量保证措施是什么?
、1.需求分析
需求分析是开发人员对系统需要做什么和如何做的定义过程。从系统分析的经验来看,这个过程往往是个循序渐进的过程,一次性对系统形成完整的认识是困难的。只有不断地和客户领域专家进行交流确认,方能逐步明了用户的需求。从系统开发的过程得知,系统分析时犯下的错误,会在接下来的阶段被成倍的放大,越是在开发的后期,纠正分析时犯下的错误所花费的代价越是昂贵,也越发影响系统的工期和系统的质量。
解决系统分析错误的方法我们公司通常采用邀请用户参与进行需求评定,然后对其用户的意见由质保成员跟踪检测是否纳入需求规格说明书,同时与用户签字确认形成需求基线,交由配置管理员放入配置管理库。
b、系统设计
优良的体系结构应当具备可扩展性和可配置性,而好的体系结构则需要好的设计方法,自然设计选型成为了系统设计首要的工作,究竟是采用哪种设计方法好呢?
对于设计选型不能一概而论,需要针对项目的结构、项目的特征和用户的需求来分析,同样也要考虑到参与项目小组成员的素质,如果其中大部分都没有从事过面向对象的设计且项目进对紧迫,这样没有多余的时间来培训小组成员来掌握面向对象的设计方法,尽管众所周知面向对象设计方法的优势,我们还是不如采用面向过程的方式(除用户指定开发设计方式外)可以减少项目承担的技术风险。
c、实现
实现也就是代码的生产过程。这里不仅包括代码的产生,同时也包括测试用例的产生。针对上一阶段提供详细设计,程序员开始编码并且调试程序,测试人员则根据设计进行测试用例的设计,设计出来的用例需要得到项目组成员认可由项目经理审核通过才能进入配置库。同时程序员调试完程序提交测试人员进行程序正确性检测。
d、文档管理
文档维护主要是配置管理小组的工作。文档从用途上分主要分为内部文档和外部文档。
内部文档包括:项目开发计划;需求分析;体系结构设计说明;详细设计说明;构件索引;构件成分说明;构件接口及调用说明;组件索引;组件接口及调用说明;类索引;类属性及方法说明;测试报告;测试统计报告;质量监督报告;源代码;文档分类版本索引;软件安装打包文件。
外部文档主要包括:软件安装手册;软件操作手册;在线帮助;系统性能指标报告;系统操作索引。
3、系统维护质量保证
2.使用C++赋值运算符应注意什么地方?
如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能
用“引用传递”,否则会出错。
对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return
语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。
对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp
的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效
3.exit()和_exit() 的区别。
exit()‟与…_exit()‟的基本区别在于前一个调用实施与调用库里用户状态结构(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序,在退出程序前,关闭文件,清除缓存。后一个函数只为进程实施内核清
除工作。不关闭文件,不清楚缓存。
4.哪些方法可让一个进程仅有一个实例运行?
设置临界区,(可以定义自旋锁不?)使用Microsoft提供的互斥类Mutex
使用API函数,获取当前进程,遍历正在有相同名字运行的进程。
红黑树比A VL树的优势在哪?
红黑树引入了“颜色”的概念。引入“颜色”的目的在于使得红黑树的平衡条件得以简化。正如著名的密码学专家Bruce Schneier所说的那样
,“Being Partly balanced can be good enough”,红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了
对旋转的要求
,从而提高了性能。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不
平衡都会在三次旋转之内
解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们
一个比较“便宜”的解决
方案。红黑树的算法时间复杂度和A VL相同,但统计性能比A VL树更高。
5.阻塞模式的recv在没受到数据的情况下如何返回?(不能将socket修改为非阻塞)
recv(fd,buf,sizeof(buf),flag)函数原型
将recv()函数的标志位设为停止等待或者设置一个延时退出,超时返回什么的
recv(fd, buf, sizeof(buf), MSG_DONTW AIT);
这里采用了MSG_DONTWAIT标志,它的作用是告诉recv()函数如果有数据到来的话就接受全部数据并立刻返回,
没有数据的话也是立刻返回,而不进行任何的等待。这里的MSG_DONTW AIT 是我们自己定义的一个标志。
6.strcpy()为什么会造成缓冲区溢出?可用哪个函数替代?
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,strcpy()函数将源字符串复制到缓冲区。没有指定要复
制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限
制其大小,则有可能会导致缓冲区溢出。可用strncpy() 函数替代
7.哪些方法可以避免或减少锁的使用
8. 给定一个int型数n,写一个尽可能简单的函数判断n是否为2的幂,不能用循环。
答:bool foo(int n)
{
int a=n;
if(n<=0) return false;
a=((a&0xAAAAAAAA)>>1)+(a&0x55555555); a=((a&0xCCCCCCCC)>>2)+(a&0x33333333); a=((a&0xF0F0F0F0)>>4)+(a&0x0F0F0F0F); a=((a&0xFF00FF00)>>8)+(a&0x00FF00FF); a=((a&0xFFFF0000)>>16)+(a&0x0000FFFF);
if(a==1) return true;