zaqwsx

1.1面向对象、继承与借口

C++面向对象和面向过程具体分别是什么?面向对象的特性?
1重载(Overload)和重写(Override)的区别
3封装、继承、多态
4虚析构函数、智能指针、内存泄露原因及如何避免
虚函数与纯虚函数的区别
友元函数

(子类构造、析构函数的调用顺序)
在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是?
在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样?
(C++多态虚表?多态与虚函数)
什么是 C++ 多态?C++ 多态的实现原理是什么?
什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?
虚表指针在什么位置,能在末尾吗,为什么
什么是虚函数?虚函数的实现原理是什么?
A、B、C链式继承,问最后一共有多少个虚函数表?
菱形继承(类 D 同时继承 B 和 C,B 和 C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖
多重继承下的内存结构?(简单来讲,多重继承的子类本身会有多个虚表指针,分别指向多个不同父类的虚表。如果有新的虚函数定义,则会在第一个虚表的末尾增加新的函数地址。)

1、给一个类class Player1{private:int a; char b; double c; }; 有如下问题:
(1)给定初始化的实例化对象,Player1 A; 问 Player1 B = A; Player1 C = A; 两种方式的区别?(拷贝构造函数)
(2)sizeof(Player1)的大小?(字节优化对齐)
(3)给定class Player2{private:int a; char b; double c; public: virtual fun(c){}}, 问sizeof(Player2)的大小?(虚函数表)

1.2基础

C与C++的区别是什么
C++11相对于c98的新特性

1.3 STL标准库

一 容器
vector扩容,vector的缺点
Vector、List和Map底层实现原理
二 智能指针
实现一下shared_ptr
智能指针?shared_ptr引用计数的时期?unique如何保障独占?
三种智能指针, shared,unique,weak
shared_ptr和unique_ptr区别,怎么相互转换

1.4 常见

inline的作用
struct和union的区别,字节对齐
右值引用?string什么时候发生右值引用?
std::move和右值引用
右值引用应用在类上需要注意什么

1.5 指针

引用和指针的相同点和不同点
指针函数和函数指针
数组指针与指针数组
指针常量&常量指针
野指针
指针需要注意什么
二级指针

1.6 关键字

static
explain
extern
const用在成员函数前、后分别什么作用
const与mutable的区别

static与普通函数变量的区别?常量存储在哪里?static变量又是存储在哪里?

C++11/14/17 常用的语言特性和类库:
统一的类成员初始化语法与std::initializer_list<T>
注解标签(attributes)
final/override/=default/=delete 语法
auto 关键字
Range-based 循环语法
结构化绑定
stl 容器新增的实用方法
std::thread
线程局部存储 thread_local
线程同步原语 std::mutex、std::condition_variable 等
原子操作类
智能指针类
std::bind/std::function

2.1 数据结构

布隆过滤器
常见的hash算法
哈希冲突解决办法
memcached 一致性哈希
Hashmap
STL map/unordermap是如何实现的,
map中为何使用红黑树而不是二叉平衡树?
B/B+树及区别,B+树有什么缺点,哪些需要优化的地方?
红黑树、红黑树性质
红黑树和AVL树相比呢,优势在哪里?
B+树作为索引的话为什么比二叉树快?(从时间复杂度的角度分析)
红黑树和哈希表什么区别
索引的实现方式有哪些?(B+树索引、位图索引、哈希索引)

链表 倒数k节点
链表 环判断,怎么找环的其实位置
判断图是否有环
判断两个链表相交,如果相交,求其交点
跳表插入删除过程

2.2 基础算法、手写代码环节

各种排序算法,排序算法的稳定性,时间复杂度,归并排序/堆排序思想
(频率:频率考排序为:快速排序 > 冒泡排序 > 归并排序 > 桶排序)
经典topk 算法 问题,分析时间复杂度
质数
汉诺塔怎么实现的 递归实现
判断大小端,int的大端转小端
大数相加
最长公共子序列LCS
最小编辑距离
二叉树中两个节点的最近公共父节点
数据流的中位数
背包问题
贝叶斯的概率学原理

两个有序链表合并。
有序链表删除重复结点。
二叉树求根结点到叶子的路径和为sum的路径。
求二叉排序树第三大结点。
求二叉树中序遍历的后继结点。

怎么求无向图的连通块?
并查集的并的操作和查的操作?

字符串a中剔除字符串b,不使用辅助空间
int数组求最大子串和
两个有序数组合并,n个有序数组合并
大整数加法代码(我是实现一个BigNum类,重载operator+运算符,建议不要直接写函数)

LRU缓存怎么实现

2.3 汇总

1 二分查找
结合具体的场景,例如如何求一个数的平方根,如何从所有很多的ip地址中快速找个某个ip地址。
2 链表
如链表的查找、定位、反转、连接等等。经典问题,如两个链表如何判断有环。注意边界检查、空链表、返回一个链表的函数应该返回链表的头指针等等。
3 队列与栈
利用队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题(下文介绍多线程面试题时详细地介绍)。
栈一般对于基础要求高的面试,会结合函数调用实现来问。即函数如何实现的,包括函数的调用的几种常见调用方式、参数的入栈顺序、内存栈在地址从高向低扩展、栈帧指针和栈顶指针的位置、函数内局部变量在栈中的内存分布、函数调用结束后,调用者和被调用者谁和如何清理栈等等。某年面试京东一基础部门,面试官让写从0加到100这样一个求和算法,然后写其汇编代码。
4 哈希表
哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的检测、让面试者写一个哈希插入函数等等。基本上一场面试下来不考察红黑树基本上就会问哈希表,而且问题可浅可深。我印象比较深刻的是,当年面试百度广告推荐部门时,二面问的一些关于哈希表的问题。当时面试官时先问的链表,接着问的哈希冲突的解决方案,后来让写一个哈希插入算法,这里需要注意的是,你的算法中插入的元素一定要是通用元素,所以对于 C++ 或者 Java 语言,一定要使用模板这一类参数作为哈希插入算法的对象。然后,就是哈希表中多个元素冲突时,某个位置的元素使用链表往后穿成一串的方案。最终考察 linux 下 malloc(下面的ptmalloc) 函数在频繁调用造成的内存碎片问题,以及开源方案解决方案 tcmalloc 和 jemalloc。总体下来,面试官是一步步引导你深入。
5 树
高频:红黑树,B/B+树。
红黑树的概念、左旋右旋的方式、分析出查找和插入的平均算法复杂度和最好最坏时的算法复杂度。一般 C++ 面试问 stl 的map,java 面试问 TreeMap 基本上就等于开始问你红黑树了。
B树一般不会直接问,问的最多的形式是通过问 MySQL 索引实现原理(数据库知识点将在下文中讨论)
6 图
深度优先和广度优先问题。

3.1 内存管理

C++内存管理机制(malloc底层和Alloc两层空间配置器)
malloc与new的区别,各自底层实现原理,如果new一次,delete两次会发生什么
new分配的内存是虚拟内存还是物理内存
虚拟内存
内存池,怎么实现内存池
内存分布模型(从低地址到高地址,一个程序由代码段、数据段、 BSS 段组成)
堆和栈的区别,生命周期
内存泄漏,什么情况容易出现内存泄漏?如何避免内存泄漏?
堆内存申请需要注意什么?
内存碎片?
malloc内存管理原理
初始化为0的全局变量在bss还是data
Linux内存管理方法,页面置换算法,逻辑地址和物理地址的转换
在一台内存为2G的机器上,malloc(20G)会怎么样?new 20G呢?
1、内存分布与内存管理方式
2、虚拟内存与物理内存
3、malloc分配的是虚拟内存还是物理内存?
4、memset操作malloc的指针,是操作物理内存还是虚拟内存?

3.4 进程与线程

进程与线程(区别)
多进程与多线程的区别
多进程之间怎么实现同步的?
线程之间的同步方式?(锁,信号量)
惊群效应(多个线程或进程等待一个唤醒的情况)

3.4.1 进程

进程间通信方式有哪些,各有什么特点,什么应用场景
进程调度算法
进程切换
消息队列
7、最快的进程间通信方式是什么?(共享内存)
8、共享内存为什么比其他的进程间通信方式快?
9、重启进程后,原共享内存是否可以操作?对于普通的进程又是如何呢?
10、什么是僵尸进程?
Linux进程地址空间分布
解释孤儿进程,僵死进程,惊群效应

3.4.2 线程

线程池
怎样保证线程安全
设计模式?单例如何保证线程安全?设计模式里面的面向对象思想?
同步互斥的作用(保证线程安全,多线程的情况下依然能得到预期的结果)

3.4.3锁

OS中都有什么锁
乐观锁与悲观锁?实现方式
什么是死锁,死锁的必要条件,如何处理死锁
死锁怎么解决,银行家算法描述,找到造成死锁的进程怎么处理(杀死,抢占,回滚),回滚如何实现
避免死锁的一个著名算法是?银行家算法,该方法将系统的状态分为安全状态和不安全状态,只要使系统处于安全状态,便可避免死锁的发生

3.4.4 协程

...

3.4.5 Windows

对于 Windows 开发者,你需要熟练使用 Interlock系列函数、CriticalSection、Event、Mutex、Semphore等API 函数和两个重要的函数 WaitForSingleObject、WaitForMultipleObjects。
对于 Linux 开发者,你需要熟练使用 mutex、semphore、condition_variable、read-write-lock 等操作系统API。
可以使用 C++ 实现一个简单的线程池,当然支持优先级、动态创建线程功能就更好了。

3.5 Linux、调试

ps,top命令
查看CPU的命令和磁盘IO的命令
Group ID和PPID什么区别?
gdb怎么调试运行的程序,加断点,怎么分析core文件
gdb怎么切换线程
有一个运行的进程突然挂掉,怎么查看它是哪里出问题了?

3.6 Linux操作系统

5、文件系统的inode,硬链接与软连接。

3.7 编译

Linux静态库和动态库有什么区别?动态库的加载器是哪个?

6.1 数据库

数据库各种原理
数据库索引?B+树?聚簇索引VS非聚簇索引?联合索引?
mysql的事务隔离级别,每个级别分别有解决了什问题?
mysql的慢查询,如何定位时间?

(1)熟悉基本 SQL 操作
包括增删改查(insert、delete、update、select语句),排序 order,条件查询(where 子语句),限制查询结果数量(LIMIT语句)等
(2)稍微高级一点的 SQL 操作(如 Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)
(3)索引的概念、索引的原理、索引的创建技巧
(4)数据库本身的操作,建库建表,数据的导入导出
(5)数据库用户权限控制(权限机制)
(6)MySQL的两种数据库引擎的区别
(7)SQL 优化技巧

6.2 内存数据库&缓存技术

缓存与redis
redis 数据结构的底层实现
redis 如何实现高可用
负载均衡 算法 有哪些
负载均衡的加权轮询 算法 怎么实现
redis中的数据结构
redis事件处理流程

Redis 持久化机制,redis 销毁方式机制,MQ 实现原理
Redis 支持的基础数据类型、Redis的数据持久化、事务等。
(深)Redis 的网络通信模型、Redis 各种数据结构的实现等
Redis高可用、cluster、哨兵策略等。

流水线作用,为什么要用流水线
cache作用

不了解

服务发现是怎么实现的
熔断是怎么实现的
id生成器怎么实现的,如何实现全局递增

4 网络原理

select/poll与epoll区别
tcp三次握手,四次挥手,发送的包名,状态图,对应的POSIX API
哪些网络协议
说一下DNS协议
子网掩码作用
TCP和UDP区别,TCP如何保证可靠性,对方是否存活(心跳检测)
UDP能保证数据包顺序吗
GET 和 POST
流量控制,拥塞控制
SYN Flood攻击
HTTP状态码有哪些
Libevent如何处理IO事件,信号事件,和定时事件
socket函数, socket编程了解哪些?, socket 基础 API 的使用
计算机网络七层结构?每一层主要做什么?http、tcp分别属于哪一层?
http与https的区别?https的加密方式?
OSI七层及TCP/IP五层
tcp链接建立和断开的过程,状态转移
网络io模型
哪些网络操作可以使异步的
reactor模式和preactor模式,区别

1、TCP的三次握手过程?
2、UDP怎么实现TCP的拥塞控制?
3、tcp的timeout状态含义,怎么避免timeout
4、TIME_WAIT的作用
2、四次挥手中,TIME-WAIT状态是在哪一步?
3、TIME-WAIT()状态下的等待时间是多少?(2MSL)为何是2MSL?
4、TCP中的流量控制原理
5、TCP的拥塞控制原理及实现拥塞控制的主要算法有哪些?(我只说了慢启动,面试官说有四种)
6、Linux下的Socket编程常用的抓包工具

客户端与服务器端网络通信的流程(回答 【客户端创建socket -> 连接server ->收发数据;服务器端创建socket -> 绑定ip和端口号 -> 启动侦听 ->接受客户端连接 ->与客户端通信收发数据】即可)

如 select 函数的用法,非阻塞 connect 函数的写法,epoll 的水平和边缘模式、阻塞socket与非阻塞socket的区别、send/recv函数的返回值情形、reuse_addr选项等等。Windows 平台可能还会问 WSAEventSelect 和 WSAAsyncSelect 函数的用法、完成端口(IOCP模型)

进阶:
nagle算法;
keepalive选项;
Linger选项;
对于某一端出现大量CLOSE_WAIT 或者 TIME_WAIT如何解决;
通讯协议如何设计或如何解决数据包的粘包与分片问题;
心跳机制如何设计;(可能不会直接问问题本身,如问如何检查死链)
断线重连机制如何设计;
对 IO Multiplexing 技术的理解;
收发数据包正确的方式,收发缓冲区如何设计;
优雅关闭;
定时器如何设计;
epoll 的实现原理。

设计

生产者消费者模式

未分类

1.大数据处理bitmap相关
2.strcpy函数的问题
3.IO模型
select模型,epoll模型,poll模型区别
1.Nginx负载均衡
2.Nginx框架实现
3.Nginx进程绑定个数,为什么要这么做
4.Nginx处理惊群

同步、异步、阻塞、非阻塞?
回调的概念
NIO、BIO、AIO?
MVC三层架构?为什么要用它?

5.大数 排序 处理
6什么是字节对齐?怎么修改字节对齐的规则?
7给两个文件,里面均有超过50亿条域名,各自文件内假设没有重复,互相之间有若干条一样的,找出来。
8 40G的字符串,里面有2个字符串是重复的,怎么找出来?
9 cookie和session。
10 struct和union的区别?union应用场景是什么?
11.十亿个url中找有没有特定的一个网址
ET和LT的区别,需要注意什么
ACID, 索引种类
10亿个IP,取出频次出现最多的TOP10个IP?
10亿行32位无符号整数,找出第7亿大的数是多少?只给300M内存?
很大数组中找第K大元素?
实现有符号大数链表加法,靠近头结点位置为高位。

paxos算法,raft算法

4.C++里堆区和栈区的区别。
堆区是在进程初始化的时候出现的,由程序员管理的,可操作大小可达几个G,具体和虚拟内存的大小相关,地址向高地址扩展;
栈区是由系统管理的,在线程创建时产生,可操作大小在1M左右,向低地址扩展。
5.说说你对static关键字的理解
主要有3个作用

修饰局部变量,使其作用域不变的情况下,延长生命周期到整个程序的运行期间;
修饰类成员,使其编程静态全局变量,需要在类外初始化;
修饰类方法,但修饰过后静态方法就不能访问非静态成员及方法;
【面后补充】:(static修饰的全局变量不能被extern到其他文件、存放在全局数据区、对其他文件隐藏、其他文件定义同名变量不会发生冲突)

下面再列举几个常见的编码题:

(1)实现一个 memmov 函数
这个题目考查点在于 memmov 函数与 memcpy 函数的区别,这两者对于源地址与目标地址内存有重叠的这一情况的处理方式是不一样的。
(2)实现strcpy或strcpy函数 这个函数写出来没啥难度,但是除了边界条件需要检查以外,还有一个容易被忽视的地方即其返回值一定要是目标内存地址,以支持所谓的链式拷贝。即:
strcpy(dest3, strcpy(dest2, strcpy(dest1, src1)));
(3)实现atoi函数
这个函数的签名如下:
int atoi(const char* p);

一个有10亿个节点的平衡二叉树中,每个节点有指向父节点的指针,先给定其中的两个节点,怎么找他们的公共父节点?


一 语言
二 数据结构与算法
三 操作系统 1内存篇/2并发篇/3cpu篇/4进程线程篇
四 网络原理
五 网络编程
六 数据库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 搬运自牛客网大神总结 extern关键字 extern修饰变量是个声明,此变量/函数是在别处定义的,要在此处引用 ...
    leon4ever阅读 3,654评论 0 9
  • 面经专题系列:Android面经| 问题归纳Android面经| 回顾展望Android面经| 算法题解 @[to...
    heyrenly阅读 1,219评论 0 4
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,222评论 11 349
  • 金九银十即将到来,整理了20道经典Redis面试题,希望对大家有帮助。 1. 什么是Redis?它主要用来什么的?...
    学编程的小屁孩阅读 1,533评论 0 1
  • JVM 说一下 jvm 的主要组成部分?及其作用? JVM包括类加载子系统、堆、方法区、栈、本地方法栈、程序计数器...
    文刀雨木同阅读 428评论 0 1