奇虎360 2014后台研发二面面经(含参考答案)

面试题目:

1.C和C++

● 堆和栈的区别

堆和栈均是计算机硬件层面的上概念,操作系统给每个进程分配4G(前提32位)的虚拟内存空间。内存空间分别由堆、栈、数据段和代码段组成。总体来说,堆和栈的区别主要有一下几点:

1)存的值的类容

堆中的值一般是由new、malloc、realloc分配的,存值类容不固定。可以往里写任何类型的值。栈里存的是函数返回地址,函数参数和局部变量等。

2)分配与管理

堆是动态分配的,需要程序员调用new、malloc等分配,调用delete,free等释放。栈是由编译器将源代码编译成一条条“push”“pop”指令,CPU执行到“push”就自动压栈,执行到“pop”就自动弹栈。无需程序员管理。push、pop指令是编译器自动生成的,无需显示告诉其何时“push”何时“pop”,达到了自动管理

注意:堆是动态分配的(malloc、new、realloc),栈可以静态分配也可以动态分配(alloca函数)

3)生长方式不同

栈是自顶向下增长,堆的增长方式有三种:首次适应、最佳适应和最差适应

4)是否产生碎片

栈不会产生碎片,堆会产生,尤其是频繁分配和释放的时候

5)空间大小不同:win32中,堆可达4G;VC中栈默认1M(可以修改)。

● new和malloc的区别

new是C++里的运算符,而malloc是c里面的函数。c++之所以要引入new关键字是因为malloc是封装好的库函数,无法修改内部结构。但是,在C++里,如果不是内部数据类型,在绝大多数情况下分配内存的时候是要调用构造函数,释放内存的时候要调用析构函数的(注意并非所有的类都会调用,一些极其简单的类是没有构造函数和析构函数的,分配方式和C完全一致)。由于malloc无法实现,因此C++里增加了new运算符。可以这么理解:new=malloc+构造函数。delete=free+析构函数。而且new和delete还可以申请数组和释放数组,如new int[10],delete[]等。

free和delete如何知道应该释放多少内存

答:malloc和new在分配内存的时候会在内存块前添加一个头部,通常是四字节(4G)或八字节(64位的,多少G就自己算吧),然后在free  p或deletep的时候找到p前面四字节或八字节大小就知道应该释放多少内存了。

● 写个类A,声明类A指针指向NULL,调用类A的方法会有什么后果,编译通过吗?

编译可以通过,运行时会产生段错误(segmentation fault ),指针指零的常见错误。

● C++如何找到不同类型的成员方法?

什么是重载,相同参数不同返回值可以吗?为什么?对不同函数编译器会加什么参数?extern C

C++的特性,C中没有。函数的参数的类型、个数或者顺序不同,因此在编译的时候会编入参数信息,例如int f(int a,double b)编译后会是f@int@double之类的,注意看没有返回值信息在里面。加了 extern C以后,编译器就按C标准编译了,因此所有的重载函数就都成了一个样子的。

● 多态在现实中的应用,多态的实现原理

http://blog.csdn.net/haoel/article/details/1948051

sizeof空类为多少?为什么这么设计?

sizeof一个空类是一个字节(char)。

一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址,这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)

sizeof一个只有一个虚函数的类等于多少?

等于sizeof(int),即一个指针的大小。一般32位系统下是4个字节。

AB两个类各自有个虚函数,C继承A和B,sizeof(C)为多少?

等于2*sizeof(int),即2倍指针大小,一般32位系统下是8个字节。

构造函数能声明为虚函数吗,析构函数呢?为什么?
● 关于地址对齐
64位是什么意思,CPU64位指的是什么,操作系统64位指的是什么?

为什么要有地址对齐,CPU如何取址?

哪些情况会遇到地址对齐,试举一例?


2.进程与线程

两者的区别——资源分配,调度,通信

os给进程和线程都分配哪些资源?

进程间通信有哪些方式(Linux)?分别怎么实现?

现有平行的几个进程,如果其中一个进程挂了,会影响其他线程吗?一个进程有多个线程,有一个挂了,对其他线程有影响吗?为什么?

一般情况下,平行的进程之间一个挂了不会对其他进程造成影响,但是在个别操作系统中,父进程挂了也会终止子进程,这种现象称为“级联终止”。

一个进程里的一个线程挂了

3.TCP
画出三次握手,四次握手,为什么要三次和四次?
讲讲滑动窗口机制

关于time_wait为什么等待2MSL才关闭,如果有大量time_wait状态连接会出现什么问题?


4.数据结构
二叉树中序遍历的非递归实现

链表倒序输出,不能改表链表结构,不能用任何自己开的辅助空间

答:不能改变链表结构,那么就不能同倒转链表法。常见的思路就是用栈,不能自己开一个栈的话,那就唯有用递归咯。

5.vim的替换语句,abc换成def

6.PHP字符串分解
7.关于linux的调试和VS的断点调试原理

你可能感兴趣的:(操作系统,网络,C/C++,笔试面试,操作系统,面试,奇虎360,研发,笔试)