1. 虚函数的实现原理,父类和子类的内存布局
虚函数的实现原理
每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表(多继承有多个。同时第一个为主基类),其中存放着该类所有的虚函数对应的函数指针。
有虚函数的类内部有一个称为“虚表”的指针,指向该表。
如果类没有重写虚函数,那么直接拷贝继承来的虚函数到虚函数表中。
如果类重写了虚函数,需要在虚函数表中覆盖对应的虚函数。
同名虚函数在虚函数表中的偏移量相同。(如果类是个多继承,且都有虚函数,那么他就有多个虚函数表指针,为了使偏移量相等。)
2. 协程和进程的区别
协程和进程区别:
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
2) 线程进程都是同步机制,而协程则是异步。
3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池,