1、C++函数三种参数传递方式
答:按值传递、通过地址传递、通过引用传递
2、引用和指针的区别
答:引用是定义一个变量的别名,指针存储一个变量地址;
引用在定义时必须初始化,指针没有要求;
引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体;
在sizeof中含义不同:引用结果为引用类型的大小,而指针始终是地址空间所占字节个数(32位平台下占4个字节,64位平台下8个字节)
引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小;
有多级指针,但是没有多级引用;
访问实体方式不同:指针需要显式解引用,引用编译器自己处理;
引用比指针使用起来相对更安全。
3、全局变量和局部变量的区别
答:全局变量和局部变量的作用域和生命周期不同,全局变量的作用域是整个程序,而局部变量的作用域仅仅在某个函数内;全局变量的生命周期从程序开始到程序结束,局部变量的生命周期会随着某个函数的栈帧销毁而结束。
4、select/poll/epoll简单说一下
答:select和poll都是通过线性结构存储已连接socket的文件描述符,然后将文件描述符集合拷贝到内核,通过遍历检查是否有事件产生,然后将有事件产生的socket标记起来,再将文件描述符集合从内核态拷贝到用户态,再次通过遍历找到有事件产生的socket,然后对其进行处理;epoll在内核中是通过维护一个红黑树来跟踪进程所有待检测的文件描述符,每次只需要传入一个待检测的socket即可,同时epoll在内核中还维护一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用 epoll_wait()
函数时,只会返回有事件发生的文件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合。