完美世界2017笔试总结

1、vector:iterator 重载了哪些运算符?

解:++,*,==   错误解:>>

 

2、不能被重载的运算符:

解:.  ?:  sizeof  ::  .*

 

3、const重载函数是合法的

 

4、对于一个空类,编译器默认生成6个成员函数:

缺省的构造函数、拷贝构造函数、析构函数、赋值运算符、一对取址运算符(另一个带const)

 

5、产生死锁的四个必要条件:

解:1>互斥使用(资源独占)

一个资源每次只能给一个进程使用

2>不可强占(不可剥夺)

资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放

3>请求和保持(部分分配,占有申请)

一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)

4>循环等待

存在一个进程等待队列

{P1 , P2 , … , Pn},

其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路

 

6、sizeof 数组:大小为数组大小

sizeof 指针:指针所占空间

 

7、C++类对象成员变量与成员函数内存分配问题

解:1>所有的函数都是存放在代码区的,不管是全局函数,还是成员函数。静态函数也不例外

2>sizeof访问的程序的数据段,而函数地址则被保存在代码段内

3>如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。 对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。 之后是子类自己的成员变量数据。

 

8、成员指针运算符

 

9、信号量:在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。一个非负整数。Wait和Release操作。用于线程同步。

互斥量:用于线程的互斥,只能为0或1。

关键段:关键段(Critical Section)是一小段代码,它在执行之前需要独占对一些共享资源的访问权。这里的原子方式,指的是代码知道除了当前线程之外,没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。

事件:

《秒杀多线程》

 

10、多线程同步

线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。
当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。
线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。
线程同步的方法
(1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉  InterruptedException异常。
(3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
(4)notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

 

11、多线程加锁

下表是一个多线程加锁的规律表

 操作的结果与初值无关

 操作的结果与初值相关

 写简单数据类型

 不需要加锁

 需要加锁

 写复杂数据类型

 需要加锁

 需要加锁

 读简单数据类型

 不需要加锁

 不需要加锁

 读复杂数据类型

 需要加锁

 需要加锁

 

12、对象初始化可以分为默认初始化、直接初始化、拷贝初始化以及值初始化。
13、程序员能访问PC程序计数器
14、最小堆的实现
15c++ find函数、sort函数(倒排)
16、平均时间复杂度为nlogn的排序算法:归并、快排、堆排
方式: 平均 最坏 最好
插入 n^2 n^2 n
希尔 n^1.3 / /
冒泡 n^2 n^2 n
快速 nlogn n^2 nlogn
选择 n^2 n^2 n^2
堆排 nlogn nlogn nlogn
归并 nlogn nlogn nlogn
基数 d(n+r) d(n+r) d(n+r)
个人资料
onion
等级:6
文章:51篇
访问:4.2w
排名: 12
上一篇: 完美世界2014校园招聘笔试题
下一篇:完美世界2017C++游戏开发笔试编程题
猜你感兴趣的圈子:
完美世界笔试面试圈
标签: 加锁、nlogn、线程、占有、唤醒、面试题
隐藏