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、最小堆的实现
15、c++ find函数、sort函数(倒排)
16、平均时间复杂度为nlogn的排序算法:归并、快排、堆排方式: 平均 最坏 最好