介绍项目:oxmark是由主程序和dll测试模块组成,功能:测试主板各种设备的功能,如:cpu,mem,hdd,odd,battery,acswitch,keyboard,mouse,blutooth,lan,wlan,graphic,audio,usb,cardreader,floppy;
测试方法:分手动测试和自动测试两种模式。运行时主程序根据路径调用dll模块进行相应测试,程序的结构:有一个公共类CTestbase,做为各个模块的基类,所有测试模块都是从CTestbase继承而来,这个类主要是搭建了一个程序架构,为各个模块提供了许多接口,主要负责:DisplayWindow()显示子模块的窗口大小和位置;输出测试参数如:测试开始的时间结束的时间、测试的结果、出错信息、错误代码等;
1.全局变量和局部变量有什么区别?
作用域不同,存储方式不同,
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
定义静态函数的好处: ?静态函数不能被其它文件所用; ?其它文件中可以定义相同名字的函数,不会发生冲突;
3.快速排序
基本思想是:任取待排序列的某个记录作为基准,按照该关键码大小,将整个序列分成两个序列——左侧的所有记录的关键码都比基准小
(或者等),右侧的都比基准大,基准则放在两个子序列之间,显然这时基准放在了最后应该放置的位置。分别对左右子序列重复上面的过程
,直到最后所有的记录都放在相应的位置。
4.关于内存对齐的问题以及sizof()的输出
答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内
存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
5.winsock建立连接的主要实现步骤?
答:TCP:服务器端:1.socket()建立套接字,2将套接字绑定到本地地址和端口上,绑定(bind)3.将套接字设为监听模式,准备接收客户端,监
听(listen);4.等待客户端请求到来,请求到来后,连接请求,并返回一个新的对应此连接的套接字,accept()5.用返回的套接字和客户端进
行通讯(send/recv);6.返回并等待另一客户请求。7.关闭套接字。
客户端:1.socket()建立套接字2.向服务器发出连接请求,(connect)2。和服务器进行通信,send()和recv(),在套接字上写读数据,直至数
据交换完毕;4closesocket()关闭套接字。
UDP:1服务器端:1.创建套接字(socekt)2.将套接字绑定到本地地址和端口上(bind);3.等待接收数据(recvfrom);4.closesocket()关闭套接
字。
6设计模式:工厂模式 和 单例模式 介绍一下?
7工程模式即将对象创建过程封装即为工厂模式。
单例模式即整个类只有一个对象,并且不允许显示创建。
8.进程间通信类型
(1)环境变量、文件描述符 一般Unix环境下的父进程执行fork(),生成的子进程拥有了父进程当前设置的环境变量以及文件描述符;由于
通信是一个单向的、一次性的通信,随后的父进程以及子进程后续的内容不能再能共享;
(2)命令行参数 大多数用户都使用过ShellExec相关的命令,此API可以打开新的进程,并可以通过接口里的输入参数进行信息共享;同样,
他也是一个单项、一次性的通信;
(3)管道 使用文件和写方式访问公用的数据结构;管道分为匿名管道和命名管道,前者是用作关联进程间用,后者为无关联的进程使用;前
者通过文件描述符或文件句柄提供对命名管道的访问,后者需要知道管道名称才能读写管道;一般来讲,读写的内容是字节流,需要转换为有
意义的结构才有意义;
(4)共享内存 进程需要可以被其他进程访问浏览的进程块;进程间共享内存的关系与函数间共享全局变量的关系类似
(5)DDE 动态数据交互
线程间通信类型:
(1)全局数据;(2)全局变量;(3)全局数据结构;4)线程间通信的参数:pThread_create这类API接口中的参数
9.在函数后面加个const是怎么理解的?
在函数后面加个const一般在类的成员函数中使用,表示这个函数不修改数据成员的值。
10.(1)class中有个默认的this指针,struct没有
(2)在模版中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”
,而class或typename后面跟的是类型参数。关于默认访问权限
(3)class中默认的成员访问权限是private的,而struct中则是public的。
(4)关于继承方式:class继承默认是private继承,而struct继承默认是public继承。
11.iterator——对于除了vector以外的其他任何容器,你可以通过这种游标在一次操作中在容器中朝向前的方向走一步。这意味着对于这种游
标你只能使用“++”操作符
12.标准模板库,也叫 STL,是一个 C++ 容器类库,算法和迭代器。他提供许多基本算法,数据结构。STL 是一个通用库,即可以充份定制:
几乎所有的 STL 组件都是模板。如果你理解了算法,迭代器,容器,那么你几乎就了解了 STL。
顺序容器(拥有单一类型组成的一个有序集合):vector和list
关联窗口(支持查询一个元素是否存在,并且可以有效的获取该元素):set和map (在这两个容器中元素是以有序关系存储的)
map:包含一个键/值对(key/value),键:用于查询,值:包含我们希望使用的数据;定义map对象至少应该指明键和值的类型,
set包含一个单一的键值,有效支持关于元素是否存在的查询;
我们需要查找并获取一个值,关联容器map是最好的选择。如果只是简单的把文本存储起来供后续处理就用顺序容器。vector、list、deque都
是动态增长的。
vector:表示一块连续的内在区域,每个元素被顺序存储在这段容器中,对vector的随机访问效率很高,因为每次访问离vector的起始位置都是
固定的;但是在任意位置插入一个元素,而不是在末尾插入元素,则效率则是很低,因为他需要把插入元素右边的所有元素拷贝一遍,删除的时
候也是一样。capacity()查询容器容量 size()容器的长度
deque:也表示一块连续的内在区域,和vector不同的是:他支持高效的在首部插入和删除元素,他通过两级数组结构来实现,第一级表示实际
的容器,第二级指向容器的首和尾。
list:表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前向后两个方向进行遍历,在list的任意位置插入删
除元素的效率都很高,但是指针要重新赋值,不用拷贝元素来实现移动(一般来说选择容器根据程序的查找和删除)
对于大型的数据类型,用list比vector要好的多,因为vector要重新增长和拷贝元素。
迭代器:提供了一个一般化的方法,对顺序和关联容器进行访问。