小米C++面经
1、include " " 和<> 区别
include< file >编译程序会先到标准函数库中找文件
include”file” 编译程序会先从当前目录中找文件
include语句一般用来包含标准头文件(例如stdio.h或stdlib.h),因为这些头文件极少被修改,并且它们总是存放在编译程序的标准包含文件目录下。#include“file”语句一般用来包含非标准头文件,因为这些头文件一般存放在当前目录下,你可以经常修改它们,并且要求编译程序总是使用这些头文件的最新版本。
https://blog.csdn.net/weixin_36571185/article/details/78240931
2、static,static局部变量?生命周期?static关键字(全局,局部,成员变量,成员函数)
https://blog.csdn.net/weixin_40311211/article/details/82851300 (讲的非常详细)
1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。
存在的意义就是随着第一次函数的调用而初始化,却不随着函数的调用结束而销毁。在第一次调用的时候初始化,且只初始化一次,也就是你第二次调用,不会继续初始化,而会直接跳过。
那么我们总结一下,静态局部变量的特点(与局部变量的对比):
(1)该变量在全局数据区分配内存(局部变量在栈区分配内存);
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存);
2.静态全局变量:定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。
静态全局变量不能被其它文件所用(全局变量可以);
其它文件中可以定义相同名字的变量,不会发生冲突(自然了,因为static隔离了文件,其它文件使用相同的名字的变量,也跟它没关系了);
3.静态函数:准确的说,静态函数跟静态全局变量的作用类似:
1.静态函数不能被其它文件所用;
2.其它文件中可以定义相同名字的函数,不会发生冲突;
4.静态数据成员:用于修饰 class 的数据成员,即所谓“静态成员”。这种数据成员的生存期大于 class 的对象(实体 instance)。静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
对于非静态数据成员,每个类对象(实例)都有自己的拷贝。而静态数据成员被当作是类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存。
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
5.静态成员函数:用于修饰 class 的成员函数
1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3.静态成员函数不能访问非静态成员函数和非静态数据成员;
4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)
3、extern externC
4、inline
5、堆和 栈区别
6、new malloc 区别
malloc/free是标准库函数,new/delete是C++运算符
malloc失败返回空,new失败抛异常
new/delete会调用构造、析构函数,malloc/free不会,所以他们无法满足动态对象的要求。
new返回有类型的指针,malloc返回无类型的指针
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。
opeartor new /operator delete可以被重载。而malloc/free则不能重载。
7、进程线程区别
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
https://blog.csdn.net/kuangsonghan/article/details/80674777
8、进程间通信
9、一道手撕算法题 平衡数
好像是一个整数 前半部分的数字相加和后半部分的数字相加 是与一样的 比如 1 2 2 1 这种
10、析构函数为什么要用virtual修饰?
总结一道面试题:那些函数不能定义为虚函数?
1)友元函数,它不是类的成员函数
2)全局函数
3)静态成员函数,它没有this指针
4)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)
11、多态 说了静态多态和动态多态,虚函数表和虚函数指针
https://blog.csdn.net/qq_42914528/article/details/82023401
函数模板 https://www.cnblogs.com/lifexy/p/8761325.html
为什么函数模板能够执行不同的类型参数?
答:
- 其实编译器对函数模板进行了两次编译
- 第一次编译时,首先去检查函数模板本身有没有语法错误
- 第二次编译时,会去找调用函数模板的代码,然后通过代码的真正参数,来生成真正的函数。
- 所以函数模板,其实只是一个模具,当我们调用它时,编译器就会给我们生成真正的函数.
12、谈一下智能指针?
13、不想让别的对象访问本类,应该怎么做?然后自己怎么访问的?(答:将构造函数设置成private,然后将定义一个static 函数用来访问私有的构造函数)
14、基类、派生类调用构造函数、析构函数的顺序,以及一些访问权限问题。
15、熟悉的数据结构吗?然后写一个二叉树的后序遍历,递归,非递归。
16、给一个数组,输出最长的连续数字子串。(一直优化)
17、协程了解过么?
协程是更轻量级的线程。用于解决线程间切换和进程间切换的通病(对内核开销过大),协程各个状态(阻塞、运行)的切换是由程序控制,而不是内核控制,减少了开销。
功能特点:通过应用层程序,记录上下文栈区,实现在程序执行过程中的跳跃执行。由此可以选择不阻塞的部分执行提升运行效率。
18、写代码,链表的插入与删除的题目
https://www.nowcoder.com/discuss/256913?type=post&order=time&pos=&page=1
19、Cpp和C区别,各自的特点
https://blog.csdn.net/humeapz/article/details/81605977
1、文件区别:C源文件后缀 .c;C++源文件后缀 .cpp
2、返回值: C默认返回int型 ;C++ 若无返回值,必须指定为void
3、参数列表:C默认接收多个参数;C++默认为void,不接收任何参数
4、缺省参数:C不支持给函数参数指定默认值;C++支持
5、C++支持函数重载,C不支持
(而C++支持重载的依仗就在于C++的名字修饰与C不同,例如在C++中函数int fun(int ,int)经过名字修饰之后变为 _fun_int_int ,而C是_fun,一般是这样的,所以C++才会支持不同的参数调用不同的函数;)
6、C指针;C++多了引用
7、C是面向过程的,C++是面向对象的。
8、结构:C中的struct和C++的类,C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,C语言结构只有成员变量没有成员方法,C++结构有自己的成员变量和成员函数。使struct在C++中可以和class一样当做类使用,struct的成员默认访问修饰符是public,而class默认的是private;
9、动态管理内存:C是使用malloc/free函数,C++除此之外还有new/delete关键字
10、C++全部变量的默认链接属性是外链接,而C是内连接;
11、C中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以(如果不进行&,解引用的操作的话,是存放在符号表的,不开辟内存);
20、C可以做应用程序吗(肯定的)
21、知道回调函数吗
22、单例模式有用到过吗
23、C 中为什么要加STL,它的特点,优点
24、经常用到的字符串的函数,标准的
https://www.cnblogs.com/bhlsheji/p/5287117.html
25、你知道可重入函数吗,怎么实现的可重入,你知道static关键字吗,它和可重入有什么关系
满足下列条件的函数多数是不可重入的:
1) 函数体内使用了静态的数据结构;
2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
https://blog.csdn.net/lixiumin001/article/details/55255468
https://zhidao.baidu.com/question/1897433622558505220.html
https://blog.csdn.net/weiwangchao_/article/details/6916890
26、volotile关键字你知道吗
27、结构体大小计算你知道吗
28、项目中有用到过多线程吗,多线程是自己写的吗,多线程相关的调用接口有哪些
https://blog.csdn.net/lmhuanying1012/article/details/75647248
29、定义一个数组A[10],不允许定义其他变量,通过指针方式取出第一个元素(感觉有坑,应该是想问数组名和指针的区别?)
30、二级指针有了解过吗,二级指针存储的内容
31、讲一讲常见的数据结构
32、队列有用到吗(对vector比较熟,,,那你讲一下吧)
33、你上学的过程中有学到数据结构这门课吗?知道图吗?
34、说一下单链表反转的思路
35、树的遍历方式有那些
36、怎么计算二叉树的深度
37、操作系统有学过吗,你知道生产者消费者模型吗?
38、你知道TCB吗?
39、说一下死锁,怎么避免死锁(不知道。。。)
40、你知道同步互斥吗
41、进程间通信了解吗
42、给你出一个编程题,算阶乘
43、驱动代码你有了解过是吗(没有!)
44、你有没有觉得计算机相关的书籍里哪些比较重要,有看过哪些书说一下
45、Python用过哪些比较多的模块/包
46、讲一下python里面的字典
47、期望工作地点
48、说一下同步异步
49、多线程怎么保证数据安全,除了加锁还知道那些
50、项目遇到困难怎么解决
51、Linux用户态内核态有了解过吗
52、对小米的了解
53、C++特性
54、有几种锁
55、操作系统堆和栈什么区别
56、排序算法知道哪些,介绍一下 时间复杂度
57、为什么要加锁
58、C++,多线程
https://www.nowcoder.com/discuss/244500?type=post&order=time&pos=&page=1
59、进程通信,线程同步(说了同步和通信方式后说了生产者消费者)
60、哈夫曼压缩(举了一个例子)
61、介绍二叉树(讲了二叉树,AVL树)
62、Linux的gcc(四个过程以及每一步的指令)
63、QT的信号槽(connect函数)
64、为什么有malloc还要有new(往它们的区别上答)
65、单例模式
https://blog.csdn.net/dove1202ly/article/details/81477511
66、三次握手和四次分手
67、栈逆序递归
68、手撕循环队列
69、linux检测内存使用情况;
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
ps命令用于报告当前系统的进程状态。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
pmap命令用于报告进程的内存映射关系
free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
https://www.cnblogs.com/mengchunchen/p/9669704.html
70、linux查看系统的常用命令
https://www.cnblogs.com/qlqwjy/p/8571559.html
71、socket服务端建立过程
72、红黑树插入、红黑树的用途(红黑树没怎么看,旋转那一块没答上来);
73、两道编程:二叉树镜像、集合的所有子集;
74、堆排
75、统计逆序对个数
剑指offer上利用归并的思想将原序列分成前后两个序列,分别统计两个序列中的逆序对个数,再统计两个序列中的逆序对个数,然后再合并继续的思路;我把思想说了之后面试官就让我手写代码,写好之后他看下了应该是对的。
76、STL中的空间配置器,问了为什么自由链表中的是8byte的倍数?
- 问了那个刚开始那道题: 如何在一个队列中记录当前队列的最大值,这个跟那个栈的最小值有点相识,不过这个难一些,我用那个栈的思想说下我的解决思路,然后面试说你确定嚒?我说我看下,然后自己发现了问题,就把自己发现的问题跟面试官讲了下,然后讲了我那个解决方法的思想就是那个栈的最小值演变而来的;之后面试官提示我pop、push、getmax这三个方法都是O(n*lg(n))的时间复杂度,我说用堆嚒?他说堆插入的时间复杂度比较长,我思考了下说做不出来。
- 最后问了那个逆序对个数的时间复杂度,让我手推公式,我也没推出来,然后面试官在我面前手推了一把
77、为什么 Linux 分为内核态和用户进程态?什么时候这二者会进行切换
之所以分开,是因为内核态可以操作更多的硬件资源,而且不用用户去关心,如果让用户自己操作,可能会产生许多错误。用户态切内核态有三种情况: 1. 系统调用, 2. 异常, 3. 外围设备中断。感觉这题和底层硬件关系密切。
78、linux根目录下几个目录的作用
79、docker原理
是一种基于容器的操作系统层级的虚拟化技术
80、线程状态有哪些(没刻意记过,漏了一个new)
一般说有3种,但也有说4种的
3种:
就绪:线程分配了CPU以外的全部资源,等待获得CPU调度
执行:线程获得CPU,正在执行
阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列
第四种:
挂起:由于终端请求,操作系统的要求等原因,导致挂起。
81、分布式session共享
82、了解哪些线程模型?
生产者消费者模型都比较熟悉,其核心是使用一个缓存来保存任务。开启一个/多个线程来生产任务,然后再开启一个/多个来从缓存中取出任务进行处理。这样的好处是任务的生成和处理分隔开,生产者不需要处理任务,只负责向生成任务然后保存到缓存。而消费者只需要从缓存中取出任务进行处理。使用的时候可以根据任务的生成情况和处理情况开启不同的线程来处理。比如,生成的任务速度较快,那么就可以灵活的多开启几个消费者线程进行处理,这样就可以避免任务的处理响应缓慢的问题。
master-worker模型类似于任务分发策略,开启一个master线程接收任务,然后在master中根据任务的具体情况进行分发给其它worker子线程,然后由子线程处理任务。如需返回结果则worker处理结束之后把处理结果返回给master。
83、poll,select,epoll区别。
https://www.cnblogs.com/aspirant/p/9166944.html
84、c和c++区别
85、http和https的区别
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
————————————————
1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
https://blog.csdn.net/qq_38289815/article/details/80969419
86、虚函数前面加static行不行
不行
简而言之,成员函数实例相关,静态函数类相关。
虚函数,是一种特殊的成员函数,用来实现运行时多态。
静态成员函数,可以不通过对象来调用,没有隐藏的this指针。
virtual函数一定要通过对象来调用,有隐藏的this指针。
所以,关键问题是static成员没有this指针。
static function 是静态决议(编译的时候就绑定了)
而virtual function 是动态决议的(运行时才绑定)
87、路由器和交换机的区别
https://blog.csdn.net/baidu_37964044/article/details/82289945
88、客户端突然没电关机,服务器怎么知道
https://blog.csdn.net/N1314N/article/details/91354169
(1)使用定时器(适合有数据流动的情况)。
(2)使用socket选项SO_KEEPALIVE(适合没有数据流动的情况)。
89、socket和描述符说一下
90、 什么是长连接、短连接?
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
1. 进程和线程的区别
2. 进程线程同步情况,条件变量和信号量的区别。
3. 两个线程循环调用,具有共享数据,使用哪种同步方式。
4. Tcp3次握手和四次挥手,为什么是四次挥手,同步分节里面有什么。
5. Time_wait状态,为什么?什么时候?那个端产生的,可不可以一个msl
6. Time_wait状态情况下产生地址和端口占用,怎么解决(socket 中的SO_REUSEADDR)
7. 设计模式知道哪些?工厂方法什么思想?工厂如果生成新的产品需要修改代码吗?怎么让他不修改代码
8. C++函数重载和多态,讲一下,动态和静态,虚函数,RTTI
9. STL哪些?底层的数据结构是什么?查询的时间复杂度
10. Map底层
11. stl查找有没有什么优化的方法
12. 求n个数中最小的k个数,n是海量数据
13. 程序题1:实现一个字符串拷贝函数,需考虑目的地址与源地址有可能重合的情况. 时间:10分钟
14. 程序题二:打印回环数字矩阵,输入参数为边长n,例如n=4,求如下的回环矩阵:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
https://www.nowcoder.com/discuss/52218?type=post&order=time&pos=&page=2
https://www.nowcoder.com/discuss/52132?type=post&order=time&pos=&page=1