C++与lua通信:C++与lua通过堆栈通信,c++调用lua,通过压栈数据,lua取到数据进行运算,再把数据返回栈顶,c++再通过api调用栈顶数据。lua调用c++,c先编写函数,再注册到lua的解释器里面,lua在table里面通过全局变量调用c++函数
线程间生产者消费者模式:生产者消费者模式间主要利用,缓冲队列。互斥锁和条件变量搭配做堵塞,最小消耗完成生产者和消费者线程间读写操作。协程可以看做不返回的函数,coroutine.create,coroutine.resume,coroutine.yield。相比较线程切换的抢占式,需要操作互斥量和通信。协程能直接切换到另一个协程,开销十分小。
map与hashmap的理解:map底层是数组+散列键值对,通过红黑树进行存储管理,键值插入到容器中,红黑树规则进行存储。hashmap底层是数组+链表,通过hash进行存储,通过键值得到hash值,再通过hash值进行与或运算得到数组小标,再到数组上面进行链表的存储与查找.
linux共享内存实现原理:就是把同一块内存映射到不同的进程中去,不同进程通过互斥量加锁的方式访问共享内存,只要两次拷贝就能实现数据互通。shmget()--申请一块共享内存shmat--把共享内存映射到进程中去shmdt--删除切断与共享内存之间的联系shmctl()控制共享内存
虚函数:基类中函数前面加virtual,基类实例化以后,就会出现一个虚函数表。基类根据虚函数表寻找子类中可能重载的自定义函数。基类的构造函数不能加virtual,因为子类实例化的时候是先执行基类构造函数再执行子类构造函数,如果加virtual相当于覆盖基类的构造了,其次是基类构造函数执行以后才给虚函数表分配指定内存。子类析构函数必须加virtual,因为基类释放的时候必须先释放子类析构函数,但是基类析构函数并不能找到子类析构函数,所以就需要基类通过虚函数表来找到子类析构函数。
TCP包分为包头和包体,包头有操作码和包长度,包体的话是字节流报文段。TCP发送数据的时候在缓冲区操作难免会出现沾包和拆包的情况出现,为了预防这种情况,一般有两种处理方式:第一填充包长度,读到一定的长度就开始读下一段报文,第二约定边界分隔符,读到边界分隔符则读下一段报文。
valgrind基于linux下运行态程序,能检测内存数组越界,内存未初始化,内存引用为释放,内存泄露。通过命令检测出来。内存泄露一般是程序申请的动态内存未释放,new和delete打印追踪,程序退出打印申请未释放内存。windows下一般使用crtdbg,当然也可以自己重构new和delete。
--以上内容均为原创,会不定时修改不正确的东西