C++面试知识笔记
Posted 城子编程特讯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试知识笔记相关的知识,希望对你有一定的参考价值。
C++面试必备
1、C++中如何调用C语言代码
可以通过extern关键字进行设置,将.c文件按照编译c文件的方式编译
/************************a.c***************************/
#ifdef __cplusplus
extern "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 __cplusplus
extern "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++面试知识笔记的主要内容,如果未能解决你的问题,请参考以下文章