然而并不是我的电话面试,但是听说问题之后,发现确实是都不会,就稍微总结一下:
1、vector对于自定义类型的存储
Vector定义在栈上,其存储内容在堆上,动态开辟内存。不论是自定义类型还是内置类型,其刚刚开辟的大小是0,其后当空间不足时,以2倍方式增长,元素可以增加可以减少,但是容量只能增加不能减少。
2、线程通讯的读写锁和互斥锁
读写锁:可以多个读者同时进行读操作,只允许一个写者进行写操作,当有读操作时,写操作将阻塞。但是这样如果在大量读操作到来时,会造成写操作饿死,一种解决方法是,写操作优先于读操作,即当有写操作发生时,其后序的读操作全部阻塞。
互斥锁:同一个时间仅仅允许一个线程对资源进行访问。其他试图访问的线程将进入阻塞状态。
自旋锁:同一时间仅仅允许一个线程对资源进行访问。但是其他的线程不会进入阻塞状态,而是在等待资源被释放。所以自旋锁适用于持锁时间较短并且不希望在调度方面花费太多的情况。
RCU锁:读-复制-更新,实际上是对读写锁的改进,他允许有多个读者和多个写者同时访问资源,写者的同步开销取决于使用的写者间同步机制,RCU对此不支持。写者在修改前拷贝一个副本,在副本上进行修改,读者完成时会发送一个信号,当所有的读者完成时,写操作开始更改原数据。
3、mvc设计模式
模型-视图-控制器模式。视图主要做与用户交互的界面,并不做任何逻辑处理,他只用于接收用户请求并且发送给模型,也可以接受响应模型发出的数据更新事件。
模型,程序的主体,代表数据模型与逻辑逻辑。
控制器,逻辑处理与控制数据的显示。实现model和view的协同工作。
4、gdb调试
显示:list,开始运行start,断点break,下一步next,print tmp打印tmp的值,finish完成当前函数调用,display tmp跟踪显示tmp的值,undisplay取消跟踪,continue运行到断点处停下来,info breakpoint显示断点信息,delete breakpoints 数字,删除几号断点,l locals显示传递的参数。
5、函数对象
函数对象就是从在了()的类方法,用于和普通对象达到相同的调用效果。调用函数对象因为,①函数对象可以有自己的状态,我们可以在类中定义状态变量,一个函数对象可以在多次调用中共享这个状态。②函数对象有自己特有的类型,例如C++STL中的排序规则。
6、回调函数 函数指针
回调函数就是函数指针的一种用法。时用回调函数实际上就是在调用某个函数的时候(通常是API函数),将自己函数的地址传递进去,然后该函数在某些情况或者需要的时候调用你传递进去的函数,然后我们可以利用这个机会完成一些操作。
函数指针,一个指向函数的指针变量,在C编译的时候,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,可以使用该函数指针调用函数,函数指针一般有两个用途,一个是调用函数,一个是做函数的参数。
7、快速排序的思想
每次取得一个基准值,比如最简单不做优化的快速排序,每次拿到左边开始的值,和右边的值做对比,确定该变量的地址,后边的数据放置到左边的位置,然后又从左边开始,依次重复,知道找到该值最终的地址,这个地址的值左边的数和后边都是比他大或者比他小的值。依次重复。