1. HASH和BST的区别, 应用场景
HASH时间复杂度O(1) BST为O(lgN), 但HASH需要的内存空间较大 所以HASH适合查询速度要求高 内存空间充足的情况
HASH不适合对一个范围的查找
HASH在输入集合不确定的情况下 可能会产生大量冲突 所以HASH适合输入集合确定的情况 而BST适合动态的查找的删除
ref.
http://topic.csdn.net/u/20081129/15/5ff0434e-7d86-4a08-b107-d5b4b58e394d.html
2. malloc和new的区别
malloc是个函数 new是个运算符
malloc分配一块无类型未初始化的内存空间 返回指向这块内存的void* new操作调用类的构造函数生成对象 返回指向对象的指针(无类型和有类型)
3. alloca, malloc, calloc, realloc和free的区别
alloca向栈申请空间,无须释放
malloc返回一块无类型未初始化内存
calloc返回一块无类型初始化过的内存
malloc() 函数和calloc ()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象。
realloc重新分配内存大小 并返回一个新地址
free 释放的内存并不立即返回给os,而是保留在内部结构中.
PS. brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求.这套机制类似于缓冲.
使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用户态和核心态的转换.
ref.
http://hi.baidu.com/frh_jlu/blog/item/c21ec2ce3ac7a03cb700c86a.html
4. inline和宏的区别
inline是编译阶段的代码嵌入 是函数 有类型检查 不能为虚函数
宏是预编译阶段的简单代码替换
5. 虚函数和虚函数表
6. 多态和虚函数
7. select和epoll的区别<socket1轮询,2端口限制 epoll1事件响应,2红黑树>
select的特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。但是如果连接很少的情况下, select和epoll的LT触发模式相比, 性能上差别不大。
这里要多说一句,select支持的句柄数是有限制的, 同时只支持1024个,这个是句柄集合限制的,如果超过这个限制,很可能导致溢出,而且非常不容易发现问题, TAF就出现过这个问题, 调试了n天,才发现:)当然可以通过修改linux的socket内核调整这个参数。
epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高,内核将句柄用红黑树保存的。
8. epoll的两种触发方式的区别, 应用场景
水平触发和边沿触发 前者会不断通知直到事件被处理 效率略低但可靠性高 后者只通知一次 适合性能要求高的场景
LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。但是LT对代码编写要求比较低,不容易出现问题。LT模式服务编写上的表现是:只要有数据没有被获取,内核就不断通知你,因此不用担心事件丢失的情况。
ET:边缘触发,效率非常高,在并发,大流量的情况下,会比LT少很多epoll的系统调用,因此效率高。但是对编程要求高,需要细致的处理每个请求,否则容易发生丢失事件的情况。
epoll默认是水平触发, 可以在ev.event设置EPOLLIN EPOLLOUT时加上EPOLLET 设为边沿触发
ref.
http://www.vimer.cn/2009/10/epoll%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.html9. 进程和线程的区别
进程就是程序的一次执行 进程间是独立的 一个进程可以有多个线程 线程共享进程的内存空间 但有自己独立的ID, 堆栈(在进程空间内外??)和上下文
10. 交换机和路由器的区别
11. sizeof和strlen的区别
sizeof是操作符 strlen是函数
sizeof是编译阶段的类型替换 假如int a=5; sizeof(a=3)后a还是5 a=3不会被执行 sizeof(f())会返回返回值类型
12. struct和class的区别
struct默认为public 而class默认为private
struct一般在栈上 而new class一般在堆中
13. static的几个作用
静态全局变量: 作用域仅本文件
静态局部变量: 函数运行结束 变量值也不会改变 函数下次使用仍然能用到这个值 这就像C++class里边static的东西 class出来的对象都能够共用这个static的变量(static.cpp)
static第一个意思是表示退出一个块后仍然存在的局部变量,第二个意思是表示不能被其它文件访问的全局变量和函数
修饰类中的成员数据: 共享静态数据
修饰类中的成员函数: 没有this参数
14. reactor和proactor的区别
reactor是同步的 proactor是异步的
reactor读写操作由处理器完成 proactor的读写操作是异步的
处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。