zoukankan      html  css  js  c++  java
  • C++后端面试,一般考察什么? 看完真懂了

    C++后端面试,一般考察什么? 看完真懂了

    带领研发团队多年,现对应试者在面试中锁需要准备的知识进行总结,主要涉及C++/C/Golang语言基础,数据结构与算法,TCP/IP协议,网络编程,Linux。

    虽然面试技巧和心态也很重要,但这里只有24K纯技术干货,期望大家能够准备好,进入我司。

    C和C++语言基础

    参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》

    1. C++多态的实现?
    2. 虚函数的作用?
    3. 虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。
    4. 动态绑定是如何实现的?
    5. 静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。
    6. 虚函数表
    7. 虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?
    8. 编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。
    1. 构造函数中计数初始化为1;
    2. 拷贝构造函数中计数值加1;
    3. 赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
    4. 析构函数中引用计数减一;
    5. 在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
    6. share_prt与weak_ptr的区别?
    • C++四种类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast
    • 内存对齐的原则
    • 内联函数有什么优点?内联函数与宏定义的区别?
    • C++内存管理
    • STL里的内存池实现
    • STL里set和map是基于什么实现的。红黑树的特点?
    • STL里的其他数据结构和算法实现也要清楚
      这个问题,把STL源码剖析好好看看,不仅面试不慌,自己对STL的使用也会上升一个层次。
    • 必须在构造函数初始化式里进行初始化的数据成员有哪些
    • 模板特化
    • 定位内存泄露
      (1)在windows平台下通过CRT中的库函数进行检测;
      (2)在可能泄漏的调用前后生成块的快照,比较前后的状态,定位泄漏的位置
      (3)Linux下通过工具valgrind检测
    • 手写strcpy,memcpy,strcat,strcmp等函数


    数据结构与算法

    这一块考察范围太广,主要靠多刷题吧,牛客网,剑指OFFER,LeetCode等。

    Hash表

    • Hash表实现(拉链和分散地址)
    • Hash策略常见的有哪些?
    • STL中hash_map扩容发生什么?
      (1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到sqrt(n)范围内的数) ;
      (2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换)
      (3) 通过swap函数将新桶和旧桶交换,销毁新桶。

    链表

    • 链表和插入和删除,单向和双向链表都要会
    • 链表的问题考虑多个指针和递归
      (1) 反向打印链表(递归)
      (2) 打印倒数第K个节点(前后指针)
      (3) 链表是否有环(快慢指针)等等。

    栈和队列

    • 队列和栈的区别?(从实现,应用,自身特点多个方面来阐述,不要只说一个先入先出,先入后出,这个你会别人也会,要展现出你比别人掌握的更深)
    • 典型的应用场景

    海量数据问题

    • 十亿整数(随机生成,可重复)中前K最大的数
    • 十亿整数(随机生成,可重复)中出现频率最高的一千个

    排序算法

    • 排序算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并
    • 每种算法的时间空间复杂度,最好最差平均情况

    位运算

    布隆过滤器

    几十亿个数经常要查找某一个数在不在里面,使用布隆过滤器,布隆过滤器的原理。布隆过滤器可能出现误判,怎么保证无误差?

    网络与TCP/IP

    参考书籍:《图解TCP/IP》,《TCP/IP详解 卷一》,《图解HTTP》,《HTTP权威指南》

    1. TCP重发机制,Nagle算法
    2. TCP的拥塞控制使用的算法和具体过程
    3. TCP的窗口滑动

    HTTP

    • http/https 1.0、1.1、2.0的特点和区别
    • get/post 区别
    • HTTP返回状态码
    • http 协议头相关

    http数据由请求行,首部字段,空行,报文主体四个部分组成

    首部字段分为:通用首部字段,请求首部字段,响应首部字段,实体首部字段

    • https与http的区别?如何实现加密传输?加解密方式?
    • 浏览器中输入一个URL发生什么,用到哪些协议?

    安全相关

    至少了解攻击的原理和基本的防御方法,常见的攻击方法有一下几种

    • SQL注入
    • XSS
    • CSRF
    • SYN洪水攻击
    • APR欺骗

    数据库

    主要参考书籍:《数据库系统概念》,《高性能MySQL》

    • SQL语言(内外连接,子查询,分组,聚集,嵌套,逻辑)
    • MySQL索引方法?索引的优化?
    • InnoDB与MyISAM区别?
    • 事务的ACID
    • 事务的四个隔离级别
    • 查询优化(从索引上优化,从SQL语言上优化)
    • B-与B+树区别?
    • MySQL的联合索引(又称多列索引)是什么?生效的条件?
    • 分库分表

    Linux

    主要参考书籍:《现代操作系统》,《APUE》,《UNP》,《LINUX内核设计与实现》,《深入理解LINUX内核》

    (1) 进程与线程区别?

    (2) 线程比进程具有哪些优势?

    (3) 什么时候用多进程?什么时候用多线程?

    (4) LINUX中进程和线程使用的几个函数?

    (5) 线程同步?

    在Windows下线程同步的方式有:互斥量,信号量,事件,关键代码段

    在Linux下线程同步的方式有:互斥锁,自旋锁,读写锁,屏障(并发完成同一项任务时,屏障的作用特别好使) 知道这些锁之间的区别,使用场景?

    1. 匿名管道与命名管道的区别:匿名管道只能在具有公共祖先的两个进程间使用。
    2. 共享文件映射mmap
      mmap建立进程空间到文件的映射,在建立的时候并不直接将文件拷贝到物理内存,同样采用缺页终端。mmap映射一个具体的文件可以实现任意进程间共享内存,映射一个匿名文件,可以实现父子进程间共享内存。
    3. 常见的信号有哪些?:SIGINT,SIGKILL(不能被捕获),SIGTERM(可以被捕获),SIGSEGV,SIGCHLD,SIGALRM
    1. 虚拟内存的作用?
    2. 虚拟内存的实现?
    3. 操作系统层面对内存的管理?
    4. 内存池的作用?STL里内存池如何实现
    5. 进程空间和内核空间对内存的管理不同?
    6. Linux的slab层,VAM?
    7. 伙伴算法
    8. 高端内存
    • 进程调度
    1. Linux进程分为两种,实时进程和非实时进程;
    2. 优先级分为静态优先级和动态优先级,优先级的范围;
    3. 调度策略
    4. 交互进程通过平均睡眠时间而被奖励;

    (1) 死锁产生的条件;

    (2) 死锁的避免;

    • 命令行
    1. Linux命令 在一个文件中,倒序打印第二行前100个大写字母

    cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d ' '| cut -c 1-100 | rev

    1. 与CPU,内存,磁盘相关的命令(top,free, df, fdisk)
    2. 网络相关的命令netstat,tcpdump等
    3. sed, awk, grep三个超强大的命名,分别用与格式化修改,统计,和正则查找
    4. ipcs和ipcrm命令
    5. 查找当前目录以及字母下以.c结尾的文件,且文件中包含”hello world”的文件的路径
    6. 创建定时任务
    • IO模型
    1. 五种IO模型:阻塞IO,非阻塞IO,IO复用,信号驱动式IO,异步IO
    2. select,poll,epoll的区别
    • 线程池,内存池 自己动手实现一遍

    Linux的API

    • fork与vfork区别
      fork和vfork都用于创建子进程。但是vfork创建子进程后,父进程阻塞,直到子进程调用exit()或者excle()。
      对于内核中过程fork通过调用clone函数,然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体,然后复制其他关于内存,文件,寄存器等信息。fork采用写时拷贝技术,因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表,因为父进程会一直阻塞,直接使用父进程页表。
    • exit()与_exit()区别
      exit()清理后进入内核,_exit()直接陷入内核。
    • 孤儿进程与僵死进程
    1. 孤儿进程是怎么产生的?
    2. 僵死进程是怎么产生的?
    3. 僵死进程的危害?
    4. 如何避免僵死进程的产生?
    • Linux是如何避免内存碎片的
    1. 伙伴算法,用于管理物理内存,避免内存碎片;
    2. 高速缓存Slab层用于管理内核分配内存,避免碎片。
    • 共享内存的实现原理?
    • 系统调用与库函数(open, close, create, lseek, write, read)
    • 同步方法有哪些?
    1. 互斥锁,自旋锁,信号量,读写锁,屏障
    2. 互斥锁与自旋锁的区别:互斥锁得不到资源的时候阻塞,不占用cpu资源。自旋锁得不到资源的时候,不停的查询,而然占用cpu资源。
    3. 死锁

    其他

    • ++i是否是原子操作
      明显不是,++i主要有三个步骤,把数据从内存放在寄存器上,在寄存器上进行自增,把数据从寄存器拷贝会内存,每个步骤都可能被中断。
    • 判断大小端

    设计模式

    分布式系统

    主要列出考察内容的方向,问题的理解就得靠自己实践和阅读书籍了,相关问题的答案在我这篇博客中给出了自己理解的程度,欢迎交流!

    以下还总结成了文档,目录内容同上,同时总结了一些技巧:


    更多资料欢迎私信。

    发布于 2019-07-05

    3 条评论

    • hello4 天前
      很全面了
    • zero萨博2 天前
      赞一个。
    无欲则刚 关心则乱
  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/xjyxp/p/11164372.html
Copyright © 2011-2022 走看看