上海聚力传媒技术有限公司VC笔试题解答 - [C++面试题]
1.实模式和保护模式
实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问00000h-FFFFFh(1MB)的地址范围额的内存,在这种模式下,cpu只能做单任务运行,寻址方式为物理地址=左移4位的段地址+偏移地址,即物理地址是由16位的段地址和16为的段内偏移地址组成。
保护模式,又叫内存保护模式,寻址采用32位段和偏移量,最大寻址空间4g,在这种模式下,系统运行与多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的支持,增加了段页寻址机制的内存管理(分段机制使得段具有访问权限和特权级,各应用程序和操作系统的代码和核心是被保护的,这也是多任务支持的实现关键和保护这个名字的又来)。寻址过程:物理地址= 由段地址查询全局描述符表中给出的段基址+偏移地址,即:物理地址由影像寄存器中的基址加上16位或者32位的偏移组成。
2.描述并比较以下对象:事件,信标,临界区,互斥对象。
临界区:一种保证在某一时刻只有一个线程能访问数据的简便办法。它只可以在同一进程内部使用。主要API函数有,产生临界区: InitializeCriticalSection,删除临界区:DeleteCriticalSection,进入临界区: EnterCriticalSection,退出临界区:LeaveCriticalSection。
互斥对象:互斥对象跟临界区相似,但它不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享,当然下面两者也有这个特点。主要API函数有,创建互斥量: CreateMutex,打开一个存在的互斥量: OpenMutex,释放互斥量的使用权:ReleaseMutex,关闭互斥量:CloseHandle。
信标:使用信号量(信标)最重要用途是:信号允许多个线程同时使用共享资源,它指出了同时访问共享资源的线程最大数目。它的API函数和使用方法都与互斥对象相似,如创建信号灯:CreateSemaphore,传入的参数可以指定信号灯的初始值。
事件:用来通知其他进程/线程某件操作已经完成。API函数有创建,打开事件对象等,特殊点的是可以用函数SetEvent人工设置事件为有无信号状态,因此创建事件对象时可以有两种方式,一种为自动重置,一种为人工重置。只有人工重置方式创建的事件对象才能正确使用函数SetEvent。
在MFC中对于各种同步对象都提供了相对应的类CCtiticalSection,CMutex,CSemaphore ,CEvent,另外为使用等待功能封装了两个类:CSingleLock和CMultiLock。这些类方便了使用这些同步对象。
3.cdecl、stdcall、fastcall是什么?哪种可以实现个数不定的入口参数,为什么?
都是函数调用的约定。
cdecl:c declare(C调用约定)的缩写,是C和C++程序的缺省调用方式,规则是,按从右至左的顺序压参数入栈,由调用者把参数弹出栈,对于传送参数的内存栈是由调用者来维护的,正因为如此,只有这种调用方式可实现个数不定的入口参数(可变参数)。
stdcall:是Pascal程序的缺省调用方式,规则是,按从右至左的顺序压参数入栈,被调用的函数在返回前清理传送参数的内存栈。
上两者的主要区别是前者由调用者清理栈,后者由被调用的函清理栈。当然函数名的修饰部分也是不同的。
fastcall:采用寄存器传递参数,特点就是快了。
4、有一段文本,统计其中的单词数。
/*----------------------------------------------------
如果一个字符串,他的前后都是空格
那么这就是一个单词而不能用字符来判断
--------------------------------------------------------*/
int WordNum(char* WordSting)
{
int wordnum = 0;
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余1页未读,立即下载