目录
C语言中堆和栈的区别
局部变量和全局变量
指针数组、数组指针、指针函数、函数指针
什么时候使用线程和进程
三次握手
const和#define相比有哪些优点
封装、继承和多态
父进程和子进程
C语言中堆和栈的区别
存储内存不同。
管理方式不同。
空间大小不同。
能够产生碎片不同。
生长方向不同。
分配方式不同。
分配效率不同。
局部变量和全局变量
在内存管理里面,全局变量放在静态区,局部变量在栈上面去申请空间,
指针数组、数组指针、指针函数、函数指针
指针数组本质是一个数组,它的每一个成员都是一个指针。
数组指针本质是一个指针指向一个数组,相当于它的一个指针里存的都是数组的首地址。
指针函数本质是一个函数,它的一个返回值是一个指针类型。
函数指针本身是一个指针,它指向的是一个函数,相当于这个指针存储的是函数的首地址。
什么时候使用线程和进程
进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位。一个进程中至少包含一个线程,线程不能独立于进程而存在,进程不能共享资源,而线程是可以的。线程可以看做是轻量级的进程,他们的关系可以从这些角度看,从属关系,共享资源,上下文切换的速度和操作对象的不同。
一个进程创建线程的数目,由可用的虚拟空间和线程的栈的大小共同去决定,只要虚拟空间足够,这个线程就可以创建成功。理论上一个进程可用的虚拟空间大小事2G,默认情况下,一个线程可用的栈空间大小是1MB,所以理论上最多只能创建的线程个数是2048个,如果想要去创建多余2048个线程的话,就需要去修改编译器的设置。如果要创建2k以上个数的线程,就需要减少线程栈的大小,一般情况下不需要这么多的线程。
当频繁创建和销毁的时候要用线程,创建一个进程要比创建一个线程的代价高出很多,而且耗时的操作使用线程可以提高应用程序的响应速度。并行操作的时候使用线程。考虑数据安全性的时候选用进程。提高单核CPU利用利用线程,多核分布要用进程。
三次握手
是客户端向服务器建立连接的过程,第一次握手客户端向服务器发送SYN包,等待服务器的确认。第二次握手,服务器收到SYN包并回复客户端SYN加ACK包。第三次握手,客户端收到服务器的SYN加ACK包,并向服务器发送ACK确认包。这样TCP连接成功,完成三次握手。
const和#define相比有哪些优点
const是用于定义常量的关键字,#define是一个预处理指令,处理的阶段是不同的,const常量可以有数据类型,而宏常量没有数据类型,分析器对const进行类型安全检查只进行字符替换,没有类型安全检查容易引起类型错误。const根据使用位置有不同的作用域。
封装、继承和多态
封装:是实现面向对象程序的第一步,就是将数据或者函数等集合在一个个的单元中(我们称为“类”),封装的意义在于保护或者防止代码(数据)被无意中的破坏。
继承:主要实现复用代码,节省开发时间。子类可以继承父类的一些属性和功能。
多态:是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行的时候可以通过指向基类的指针来调用实现派生类当中的方法。
父进程和子进程
父进程调用fork()函数后,克隆出一个子进程,子进程和父进程拥有相同的内容和代码段/数据段和用户堆栈。父进程和子进程,谁先执行是不一定的,要看CPU的调度,所以一般会设置父进程等待子进程执行完毕后再执行。