现在的位置: 首页 > 综合 > 正文

腾讯面试题总结

2017年11月21日 ⁄ 综合 ⁄ 共 2693字 ⁄ 字号 评论关闭

1.static成员函数的作用是什么?const成员函数的作用是什么?
static成员函数的作用
1)static成员函数没有this指针,通过使用非static成员显示或隐式地引用this是一个编译时错误。
2)static成员函数不是任何对象的组成部分,因而static成员函数不能声明为const。
3)static成员函数也不能声明为虚函数。
const成员函数的作用
1)不能修改类的成员变量,同时不能调用类的非const成员函数(const成员函数中,this的类型是一个指向const类类型对象的const指针,const成员函数返回*this作为一个const引用)。
2)提供了基于const的重载。const对象只能使用const成员函数。非const对象可以使用任一成员,但非const版本是一个更好的匹配。
2.如何实现线程的同步与互斥?
线程间的同步机制有:
1)互斥锁(一种比较简单的、用于实现线程间对资源互斥访问的机制)
2)条件变量(通常与互斥锁一起使用,单纯的互斥锁用于短期锁定,主要用来保证对临界区的互斥进入。而条件变量则用于线程长期等待,直至所等待的资源成为可用资源)。
3)信号量机制(可用于多线程OS中)
3.页面置换算法
考查范围:操作系统-存储器管理-页面置换算法
概念回忆:在进程运行过程中,若其所要访问的页面不在内存而需要把他们调入内存中,但内存已经无空闲空间时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。通常,把选择换出的页面的算法成为页面置换算法。置换算法的好坏将直接影响到系统的性能。
1)最佳置换算法:一种理想化的算法,具有最好的性能,但实际上却难于实现。其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法通常可以保证获得最低的缺页率。由于人们无法预知一个进程在内存的若干页面中,哪一个页面是未来最长时间不再被访问的,因而将算法无法实现。
2)先进先出页面置换算法(FIFO):该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3)最近最久未使用置换算法(LRU):根据页面调入内存后的使用情况进行决策。LRU置换算法时选择最近最久未用的页面予以淘汰。
可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面 的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。
4)Clock置换算法
简单的Colock置换算法:只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针连接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问为。如果是0,就选择该页置换出;若为1,就重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回队首去检查第一个页面。——又称为最近未用算法NRU。
改进型Clock置换:在该算法中,除需考虑页面的使用情况外,还须增加一个因素,即置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。
其他算法包括最少使用置换算法(LFU),页面缓冲算法(PBA)。
4.TCP和UDP有什么区别?什么时候用TCP,什么时候用UDP?
考查范围:计算机网络-运输层
TCP最主要的特点是:面向连接的运输层协议,每一条TCP连接只能有两个端点(点对点),TCP提供可靠交付的服务,TCP提供全双工通信,面向字节流。
UDP的主要特点是:面向无连接的,使用尽最大努力交付,面向报文的,没有拥塞控制,支持一对一、一对多、多对一、多对多的交互通信、首部开销小(8字节,TCP需要20字节)
5.什么是三次握手?
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1,seq=j+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
6、关于类与类实例之间的关系
依赖:用到了别人的方法或变量;关联:对称的,好比你是我的朋友,我也是你的朋友;聚合:非对称的,员工与公司就是聚合关系,还有一个重要特点就是生命周期可以不同,员工离开了公司还是可以活的;组合:生命周期一致,好比人与心脏,一个没了另一个也没了。强度:依赖<关联<聚合<组合。
7、C++和Java的区别,JVM是什么,具体用来做什么
Java是纯面向过程的,而C++既可以面向对象也可以面向过程。
Java是运行在JVM(java virtual machine)上的,编译生成的是JVM可识别加载的.class,而C++直接编译后能在计算机上直接运行。
8、图像处理中位图BMP的格式是怎样的
VC中有BITMAPFILEHEADER和BITMAPINFOHEADER,以及数据区。灰度图像有调色板。
BITMAPFILEHEADER里面有文件类型、大小、两个保留字节以及一个偏移量(到数据区的)
BITMAPINFOHEADER包括长宽,图像大小(Width'*Height),像素的位、是否压缩等信息。
调色板是一个数组,每一个元素是RGBQUAD结构,包括rgb三个分量和一个保留字节。
9、两个数相乘,小数点后位数没有限制,请写一个高精度算法
跟我们平时做有理数乘法是一样的,先记录下小数点的位置,Index1和Index2,将剩下的数当做整型来乘就可以了。由于位数没有限制,所以这里需要用大数相乘,在乘的时候跳过小数点就可以了。最后决定小数点的位置即可。
10、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
#define max(a,b) (fabs((a) - (b)) == ((a) - (b)) ? (a) : (b)
11、如果自己为一个类写sizeof函数,应该考虑哪些问题?

template<typename T>
inline int MySizeOf(const T &t)
{
   return static_cast<char *>(&t + 1) - static_cast<char *>(&t);
}

抱歉!评论已关闭.