做物流用哪个网站好,营业执照注册官网,织梦医疗网站,大连网站制作的公司哪家好昨天面试了一家公司#xff0c;招的是分布式存储开发#xff08;不懂为什么会捞我#xff09;#xff0c;疯狂问底层的东西#xff0c;我都不会#xff0c;甚至在我思考后答题的时候#xff0c;其中一个面试官笑了出来…感到无语#xff0c;很想问你笑什么#xff1f;…昨天面试了一家公司招的是分布式存储开发不懂为什么会捞我疯狂问底层的东西我都不会甚至在我思考后答题的时候其中一个面试官笑了出来…感到无语很想问你笑什么忍住了
今天面试了海康赞赞赞面试体验非常非常的好自信大增。下面记录一下我觉得答的不好的问题。
1. 析构函数为什么要用虚函数
沉默了其实最近有看深入理解C对象模型 但是没有思绪真的没有… 看了网上答案一下就理解了。
因为多态情况下虚基指针指向派生的时候析构函数如果不是虚函数那么调用的就是基类的析构函数假设你在需要在派生对象做一些数据清理工作结果是派生对象的析构函数就不会调用。
2. 线程池有什么优点
参考https://blog.csdn.net/qq_40344790/article/details/131545279
1. 线程池的介绍
线程池是一种线程管理的概念它主要用于优化多线程应用程序的性能和资源利用因为在多线程中创建和销毁线程是一个开销较大的操作。线程池通过预先创建一组线程并将任务提供给这些线程来执行从而避免了重复创建和销毁的开销。线程池可以限制并发线程的数量避免资源过度占用从而更好地管理系统资源。
2. 线程池的组成
任务队列 用于存储待执行的任务线程池管理器 负责创建管理和调度线程池中的线程。工作线程执行任务的单位它们会从工作队列拿任务进行执行。
3. 这个比较有意思
https://mp.weixin.qq.com/s?__bizMzIxNjA5ODQ0OQmid2654703373idx1sn374264396f46032f50d19ab82fcdd2eachksm8c411cf3bb3695e5ccd5fd6d396919fb815a8d56d0e9ed77b7e1e9fd3124d38f720b1755c2c6cur_album_id1989460124624551937scene189#wechat_redirect
线程池的优化
线程本地队列每个线程有一个本地队列向线程池提交任务时优先考虑本地线程队列没有的提交到全局队列多量拉任务本地队列空的时候可以一次性多拿点任务防止多次去取任务耗时竞争会耗时窃取任务当当前任务队列为空且全局任务队列为空的时候考虑偷其他线程的任务但是注意轮询也会花时间可以考虑设置轮训的最长距离检察者用于检测线程池的性能比如隔一段时间统计线程是否运行是否忙碌然后取按规则扩容线程。减少copy能move就move
2. 构造函数可以用虚函数吗
首先,构造函数是不能为虚函数的 调用构造函数后, 才能生成一个对象
3. 单例怎么实现的如果不用once_call自己怎么实现
单例模式的作用保证一个类仅有一个实例并提供一个访问它的全局访问点。
私有化构造函数、拷贝构造函数、赋值运算符防止多个实例被初始化
类内进行私有静态实例定义
几种实现https://blog.csdn.net/unonoi/article/details/121138176
4. 工厂模式介绍一下
没啥好讲的很简单
5. 常用的gcd的调试命令
对应llldb memory read frame bt p breakpoint next continue
6. 栈和堆的区别
堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式主要有如下几种区别 1管理方式不同。栈由操作系统自动分配释放无需我们手动控制堆的申请和释放工作由程序员控制容易产生内存泄漏
2空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上程序员可申请的堆大小为虚拟内存的大小进程栈的大小 64bits 的 Windows 默认 1MB64bits 的 Linux 默认 10MB
3生长方向不同。堆的生长方向向上内存地址由低到高栈的生长方向向下内存地址由高到低。
4分配方式不同。堆都是动态分配的没有静态分配的堆。栈有2种分配方式静态分配和动态分配。静态分配是由操作系统完成的比如局部变量的分配。动态分配由alloca函数进行分配但是栈的动态分配和堆是不同的他的动态分配是由操作系统进行释放无需我们手工实现。
5分配效率不同。栈由操作系统自动分配会在硬件层级对栈提供支持分配专门的寄存器存放栈的地址压栈出栈都有专门的指令执行这就决定了栈的效率比较高。堆则是由C/C提供的库函数或运算符来完成申请与管理实现机制较为复杂频繁的内存申请容易产生内存碎片。显然堆的效率比栈要低得多。
6存放内容不同。栈存放的内容函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候要对当前函数执行断点进行保存需要使用栈来实现首先入栈的是主函数下一条语句的地址即扩展指针寄存器的内容EIP然后是当前栈帧的底部地址即扩展基址指针寄存器内容EBP再然后是被调函数的实参等一般情况下是按照从右向左的顺序入栈之后是被调函数的局部变量注意静态变量是存放在数据段或者BSS段是不入栈的。出栈的顺序正好相反最终栈顶指向主函数下一条语句的地址主程序又从该地址开始执行。堆一般情况堆顶使用一个字节的空间来存放堆的大小而堆中具体存放内容是由程序员来填充的。
7. 哪些情况下Vector迭代器会失效
ector在push_back的时候当容量不足时会触发扩容导致整个vector重新申请内存.insert导致的迭代器失效有两种情况 1插入操作导致vector扩容迭代器失效原因和push_back相同 2插入操作引起vector内元素移动导致被移动部分的迭代器失效erase导致迭代器失效 删除操作引起vector内元素移动导致被移动部分的迭代器失效。