C++面试知识笔记

Posted 城子编程特讯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试知识笔记相关的知识,希望对你有一定的参考价值。

C++面试必备        

1、C++中如何调用C语言代码

可以通过extern关键字进行设置,将.c文件按照编译c文件的方式编译

/************************a.c***************************/#ifdef __cplusplusextern "C"{#endif  //func1函数定义  int func1(int a,int b){    return a*a+b*b;  }  //func2函数定义  int func2(int a,int b){    return a*a-b*b;  }#ifdef __cplusplus}#endif
/************************a.h***************************/#ifndef __A_H#define __A_H
#ifdef __cplusplusextern "C"{#endif  int func1(int a,int b);   int func2(int a,int b);     #ifdef __cplusplus}#endif  #endif
/************************b.cpp***************************/#include <iostream>#include "test1.h"using namespace std;int main(void){  int param1 = 1;  int param2 = 2;  int param3 = func1(a,b);  cout<<"a*a+b*b="<<param3<<endl;}

2、值、指针、引用传递区别

1、传值是函数的形参拷贝值的过程,将传入的值(可能为类或者结构体)等拷贝存储在栈上,这样会消耗一定的空间。

2、 传指针是形参向函数所属的栈拷贝数据的过程,但传入的是四字节的指针地址。

3、传引用是形参的数据拷贝过程,其相当于为数据所在的地址起了一个别名。从效率上看传指针和引用效率高,传值消耗空间和时间,效率低。

3、进程的通信方式

进程的通信方式有:信号量、管道、命名管道、共享内存、套接字、信号、消息队列

管道:半双工通信,数据单向传输,仅在父子进程间使用;但命名管道可以在无亲子间的进程通信

共享内存:能够被其他任何进程访问的内存空间,由一个进程创建可以实现多个其他进程的访问,一般配合信号量等配合使用。

信号量:是一个计数器,一般作为锁使用,可以控制多个进程对共享内存的访问。

套接字:常用的进程间的通信方式;信号:用于通知进程某事件发生。

消息队列:是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。有写权限的进程可以向消息队列中添加新消息;有读权限的进程则可以从消息队列中读走消息。(引自csdn博主:ve2102388688)

4、http和https的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

  为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。(引自:博客园的博主:爱哭的蛙蛙)

5、STL的内存配置器

stl的内存管理一般通过默认的allocator来实现,不过也可以通过自定义的allocator实现(通过allocator模板定义的接口实现即可)。stl的内存分配分为两级分配器,一级分配器申请的内存大于128byte,通过malloc向系统的堆中分配内存;当所申请的内存小于128byte时,启动二级分配器,从预先分配好的内存池中取出一块最合适的交付出来。这个内存池由16个不同大小(8的倍数,8~128byte)的空闲列表组成,这样allocator会根据申请的内存大小选择相应的最接近的内存分配出来。

6、HTTPS工作流程

   来自简书:一杯刘,链接:https://www.jianshu.com/p/a68ca86183d7

  • client 向某网站发出请求

  • server 收到请求,并自己生成一对密钥,即 公钥 和 私钥S、

  • server 把生成的 公钥 传递给 client 

  • client 收到 公钥 后进行判断,若无效,弹出警告,否则生成一串随机数,即私钥 ,然后 client 用 server 传过来的 公钥 对该随机数加密,形成私钥

  • client 把私钥传递给 server

  • server 收到会话私钥,用 私钥把会话私钥解密,然后把需要传递的数据用 会话私钥 进行加密

  • server 把数据传递给 client

  • client 收到数据,用 会话私钥 解密,完成数据接收。


7、什么是死锁,死锁的四个必要条件,如何避免死锁?

    死锁是两个或者多个进程在执行进程中,由于系统资源竞争或者通信而造成的阻塞现象,此时系统两个或者多个进程处于等待对方释放资源等现象称为死锁。

    死锁的四个必要条件:互斥条件(进程分配的资源防止其他进程请求使用)、请求与保持条件(所请求的资源处于其他进程汇总,进程请求处于阻塞,自身获得的资源保存不释放)、循环等待条件(循环等待请求在其他进程中的资源释放)、不可剥夺条件(进程所获得资源不能被其他进程夺走)。
   避免死锁:

1、占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源。

2、分配每个进程所需的全部资源。

2、具有相同的加锁顺序。如果多个线程需要对多个 Lock 进行锁定,则应该保证它们以相同的顺序请求加锁

3、使用定时锁。程序在调用 acquire() 方法加锁时可指定 timeout 参数,该参数指定超过 timeout 秒后会自动释放对 Lock 的锁定

8、map 和 unordered_map 的区别

map的底层原理是使用红黑树实现的,红黑树可以做到在O(log n)时间内完成查找,插入和删除等操作;另外,红黑树是一种二叉查找树且有序,其中序遍历时得到的元素是有序的。对于一些需要用到有序性的应用场景可采用map。unordered_map的底层采用的是哈希表hash_table实现,其由一个大的数组,其中数组的元素节点可挂接链表实现hash冲突。哈希表的最大优点就是数据的存储和查找时间大大降低。

是基于hash_table实现,一般是由一个大vector,vector元素节点可挂接链表来解决冲突来实现。hash_table最大的优点,就是把数据的存储和查找消耗的时间大大降低,可以看成是常数时间,但是缺点又在于其建立哈希表的时间消耗较大。

9、vector与deque的比较

deque支持头部的快速插入与快速移除,这是deque的优点

Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间

deque允许于常数时间内对起头端进行元素的插入或移除操作 

deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来

deque访问容器元素的效率比vector容器慢很多(原因deque要跨内存块来访问,而vector只是使用一个内存块)。

10、deque的实现原理

deque是一种双向开口的连续线性空间,并由一段一段的定量的连续空间构成。一旦有必要在deque前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在deque的头端或者尾端。

  deque采取一小块连续的内存空间,其中每一个元素都是一个指针,指向另一段连续性内存空间(缓冲区是deque的存储空间的主体)。

     当 deque 需要在头部或尾部增加存储空间时,它会申请一段新的连续空间,同时在 map 数组的开头或结尾添加指向该空间的指针,由此该空间就串接到了 deque 容器的头部或尾部了。

— END —


 

以上是关于C++面试知识笔记的主要内容,如果未能解决你的问题,请参考以下文章

C++面试知识笔记

C++面试知识笔记

C++面试笔记--继承和接口

C++面试笔记--树

C++面试易错知识点总结(持续更新中)

LeetCode 热题 HOT 100 完整题解笔记&知识点分类 C++代码实现