赞
踩
3、请你说说指针和引用的区别
标准回答
指针和引用的区别有:
4、简述一下虚函数的实现原理
简述:
虚函数的作用:主要是实现了动态多态的机制。用父类型的指针指向其子类的实例,然后通过父类指针调用实际子类的成员函数。
实现原理:编译器在处理虚函数时,给每个对象添加一个虚函数指针,指向虚函数表。虚函数表中存储的是类中虚函数的地址。如果派生类重写了基类的虚函数,则派生类对象的虚函数表中保存的是派生类的虚函数地址,如果没有重写,则派生类对象的虚函数表中保存的是父类的虚函数地址。
消耗成本:使用虚函数时,对于内存和执行速度方面有一定的成本消耗。
1.每个对象都会变大,变大的量为存储虚函数表指针;
2.对于每个类,编译器都会创建一个虚函数表;
3.每次调用虚函数,都要有查表操作,增加了时间开销
得分点 多态、虚函数表、虚函数表指针 标准回答 1. 虚函数的作用 C++ 中的虚函数的作用主要是实现了动态多态的机制。动态多态,简单的说就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。 2. 虚函数实现原理 编译器处理虚函数时,给每个对象添加一个隐藏的成员。隐藏的成员是一个指针类型的数据,指向的是函数地址数组,这个数组被称为虚函数表(virtual function table,vtbl)。虚函数表中存储的是类中的虚函数的地址。如果派生类重写了基类中的虚函数,则派生类对象的虚函数表中保存的是派生类的虚函数地址,如果派生类没有重写基类中的虚函数,则派生类对象的虚函数表中保存的是父类的虚函数地址。 加分回答 使用虚函数时,对于内存和执行速度方面会有一定的成本:1. 每个对象都会变大,变大的量为存储虚函数表指针; 2. 对于每个类,编译器都会创建一个虚函数表; 3. 对于每次调用虚函数,都需要额外执行一个操作,就是到表中查找虚函数地址。` |
---|
5、说一说 vector 和 list 的区别,分别适用于什么场景?
解题思路
得分点
低层数据结构、内存顺序、是否支持随机访问
标准回答
6、什么是孤儿进程,什么是僵尸进程,如何解决僵尸进程
得分点
父进程先结束、占用系统资源、wt()、wtpid()
标准回答
7、请你说说 C++ Lambda 表达式用法及实现原理
答案字数太多,必免看了烦,建议自行查询!!!
8、请你说说 innodb 和 myisam 的区别
简述:
InnoDB:支持事务、行锁和外键,批量插入慢,空间、内存消耗高。 MyIsAM:不支持事务、不支持行锁,只支持表锁,不支持外键,批量插入快,空间、内存消耗较低。
得分点 事务、锁、读写性能、存储结构 标准回答 InnoDB是具有事务、回滚和崩溃修复能力的事务安全型引擎,它可以实现行级锁来保证高性能的大量数据中的并发操作;MyISAM是具有默认支持全文索引、压缩功能及较高查询性能的非事务性引擎。具体来说,可以在以下角度上形成对比: 事务 :InnoDB支持事务;MyISAM不支持。 数据锁 :InnoDB支持行级锁;MyISAM只支持表级锁。 读写性能 :InnoDB增删改性能更优;MyISAM查询性能更优。 全文索引 :InnoDB不支持(但可通过插件等方式支持);MyISAM默认支持。 外键 :InnoDB支持外键;MyISAM不支持。 存储结构 :InnoDB在磁盘存储为一个文件;MyISAM在磁盘上存储成三个文件(表定义、数据、索引)。 存储空间 :InnoDB需要更多的内存和存储;MyISAM支持支持三种不同的存储格式:静态表(默认)、动态表、压缩表。 移植 :InnoDB在数据量小时可通过拷贝数据文件、备份 binlog、mysqldump工具移植,数据量大时比较麻烦;可单独对某个表通过拷贝表文件移植。 崩溃恢复 :InnoDB有崩溃恢复机制;MyISAM没有。 默认推荐 :InnoDB是MySQL5.5之后的默认引擎。 加分回答 InnoDB中行级锁是怎么实现的? InnoDB行级锁是通过给索引上的索引项加锁来实现的。只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。 当表中锁定其中的某几行时,不同的事务可以使用不同的索引锁定不同的行。另外,不论使用主键索引、唯一索引还是普通索引,InnoDB都会使用行锁来对数据加锁。 |
---|
9、请你说说数据库的索引是什么结构,为什么不用哈希表?
得分点
B+树、内存资源
标准回答
MySQL中的索引B+树实现的; 哈希表的查询效率的确最高,时间复杂度O(1),但是它要求将所有数据载入内存,而数据库存储的数据量级可能会非常大,全部载入内存基本上是不可能实现的; B+树可以分段加载需要的节点数据,可以在内存资源有限的前提下,极大提高查询效率
10、虚析构函数有什么作用?
得分点
概念、防止内存泄露
标准回答
11、说一说常用的 Linux 命令?(常见)
标准回答
常用的 Linux 命令有:
cd:切换当前目录
ls:查看当前文件与目录
grep:通常与管道命令一起使用,用于对一些命令的输出进行筛选加工
cp:复制文件或文件夹
mv:移动文件或文件夹
rm:删除文件或文件夹
ps:查看进程情况
kill:向进程发送信号
tar:对文件进行打包
cat:查看文件内容
top:查看操作系统的信息,如进程、CPU占用率、内存信息等(实时) free:查看内存使用情况
pwd:显示当前工作目录
12、简述一下堆和栈的区别
得分点
管理方式、空间大小、是否产生内存碎片、生长方向、分配方式、分配效率
标准回答
堆和栈主要有如下几点区别:管理方式、空间大小、是否产生内存碎片、生长方向、分配方式、分配效率。
13、请你说说重载,复写,隐藏的区别
得分点
定义、作用域、有无 virtual、函数名、形参列表、返回值类型
标准回答
重载、重写、隐藏在定义、作用域、有无 virtual、函数名、形参列表、返回值类型等方面有区别。
14、请你说说各数据类型 sizeof 是多少,sizeof 指针是多少,sizeof 原理
标准回答
15、说说 const 和 define 的区别
得分点
作用、编译阶段、预处理阶段、简单替换、类型检查、内存 标准回答 const 在 C 语言中表示只读,编译器禁止对它修饰的变量进行修改,在 C++ 中增加了常量的语义。而 define 用于定义宏,而宏也可以用于定义常量。
它们的区别有:
16、请你说说 Redis 如何与数据库保持双写一致性
得分点
四种同步策略及其可能出现的问题,重试机制
标准回答
保证缓存和数据库的双写一致性,共有四种同步策略,即先更新缓存再更新数据库、先更新数据库再更新缓存、先删除缓存再更新数据库、先更新数据库再删除缓存。 先更新缓存的优点是每次数据变化时都能及时地更新缓存,这样不容易出现查询未命中的情况,但这种操作的消耗很大,如果数据需要经过复杂的计算再写入缓存的话,频繁的更新缓存会影响到服务器的性能。如果是写入数据比较频繁的场景,可能会导致频繁的更新缓存却没有业务来读取该数据。 删除缓存的优点是操作简单,无论更新的操作复杂与否,都是直接删除缓存中的数据。这种做法的缺点则是,当删除了缓存之后,下一次查询容易出现未命中的情况,那么这时就需要再次读取数据库。 那么对比而言,删除缓存无疑是更好的选择。 那么我们再来看一下先操作数据库和后操作数据库的区别;先删除缓存再操作数据库的话,如果第二步骤失败可能导致缓存和数据库得到相同的旧数据。先操作数据库但删除缓存失败的话则会导致缓存和数据库得到的结果不一致。出现上述问题的时候,我们一般采用重试机制解决,而为了避免重试机制影响主要业务的执行,一般建议重试机制采用异步的方式执行。当我们采用重试机制之后由于存在并发,先删除缓存依然可能存在缓存中存储了旧的数据,而数据库中存储了新的数据,二者数据不一致的情况。 所以我们得到结论:先更新数据库、再删除缓存是影响更小的方案。如果第二步出现失败的情况,则可以采用重试机制解决问题。
17、请你说说C++引用的概念
得分点
什么是引用、基本语法、注意事项、本质、应用
标准回答
如果你打算靠自己摸索自学,那么你首先要了解学习前端的基本大纲,这是你将要学习的主要内容,理解以及掌握好这些内容,便可以找到一份初级的前端开发工作。你还需要有一套完整的前端学习教程,作为初学者最好的方式就是看视频教程学习,初学者容易理解接受。
不要选择买书学习,这样的方式没有几个人能学会,基本都是看不下去书,也看不懂书。如果喜欢看书的学弟,可以买一些经典的书籍作为辅助即可,主要还是以看教程为主。每天抽出固定几个小时学习,做好长期学习的准备。学习编程并不是每天光看视频,你学习编程最重要的目的是为了编写软件产品,提供给大众使用,所以用手写出代码实现功能才是我们要做的事情。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。