3.18 C++八股学习

  1. 什么是内存对齐?为什么要进行内存对齐?
  2. 类如何实现只能静态分配和只能动态分配?
  3. 为什么模版类一般都是放在一个h文件中?
  4. 为什么析构函数用虚函数,不用会有什么影响?
  5. 讲一下IO多路复用
  6. 边缘触发和水平触发,边缘触发如何保证读取缓冲区所有内容?
  7. 左值、右值引用,以及作用,什么是将亡值?
  8. 什么是Unix域套接字?
  9. 迭代器失效原因,怎么编程能够避免迭代器失效?
  10. https相比http有哪些地方的变化?

1. 内存对齐,可以通过举一个例子struct来解释。可以提高处理器对数据的读取效率。内存对齐规则:可以使用#pragma pack来规定内存对齐大小。1.第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始。 结构体成员要从其内部最大元素大小的整数倍地址开始存储。3.结构体的总大小,必须是其内部最大成员的整数倍,不足的要补齐。记忆法则:起始自身、最大元素开始、最大倍数。

2.前者是把new、delete运算符重载为private属性。后者把构造、析构函数设为protected属性,再用子类来动态创建。A *p = new A();动态建立一个类对象:第一步执行operator new()函数,在堆中搜索一块内存并进行分配;第二步调用类构造函数构造对象。

3.C++标准明确表示,模版仅在需要的时候才会实例化出来,所以,当编译器没看到模版的声明时,他不能实例化该模版,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的实例时,编译器懒得去实例化,所以,整个工程的.obj中就找不到一行模板实例的二进制代码。所以我们需要放到一个文件夹中。

4.当涉及到继承时,基类的析构函数被声明为虚函数可以确保派生类的析构函数在对象被销毁时能够被调用,从而正确释放子类特有的资源。

5.IO多路复用是一种在单个线程中管理多个输入/输出通道的技术。允许一个线程同时监听多个输入流(例如网络套接字、文件描述符等),并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程。

6.在边缘触发模式下,应用程序必须在事件触发后,尽可能多地读取数据,直到无法再读出数据为止。

使用非阻塞套接字:边缘触发模式只支持非阻塞套接口,这样在读取数据时,如果缓冲区没有数据,read和recv会立即返回。

循环读取数据:在事件触发后,应用程序需要不断尝试读取数据,直到读取到所有数据或遇到错误为止

7.左值引用时C++传统的引用类型,用&符号表示。它引用的是一个已存在、有名字的对象,并且该对象在引用的作用域内是持久存在的。主要用于函数参数传递、返回值优化以及实现常规模版功能。

右值引用时C++11引入的新特性,用&&表示。它引用的是一个临时对象(即右值),通常用于实现移动语义完美转发

将亡值是C++11引入的一种值类别,属于右值的一种。指的是一个即将被销毁的对象。例子:函数返回一个对象,该对象即将被销毁,调用std::move函数,将一个左值显式转换为右值。临时对象的创建和销毁。

8.Unix域套接字是一种用于同一台机器上进程通信的机制,与网络套接字不同,Unix域套接字不需要网络协议栈,直接在操作系统内核中实现,因此具有更高的通信效率和更低的延迟。

具体而言,是创建一个套接字并绑定到文件路径,然后监听该套接字上的连接请求。客户端通过连接到该套接字文件与服务器建立通信。通信双方可以通过套接字发送和接收数据

9.迭代器失效指的是:在对容器进行修改(如插入、删除、重分配)先前的迭代器、指针或引用可能不再有效,访问它们会导致未定义行为。如何解决迭代器失效:插入或删除操作后,重新获取迭代器。遍历容器时删除元素,使用 erase() 的返回值获取下一个有效迭代器。使用 vector::reserve() 预先分配内存,减少插入操作导致的迭代器失效。

10.增加了SSL/TLS握手过程,以确保数据传输的加密和安全。(1)客户端发送一个消息,包括客户端生成的随机数A、客户端支持的协议版本号、加密方式。(2)服务端确认双方使用的加密方式,并给出数字证书、一个服务器生成的随机数B。(3)客户端确认数字证书有效,生成一个新的随机数C,使用证书中的公钥对C加密,发送给服务端。(4)服务端使用自己的私钥解密得到C

客户端和服务器根据约定的加密方法,使用三个随机数ABC,生成对话秘钥,之后的通信都用这个对话秘钥进行加密。

使用 RSA 密钥协商算法的最大问题是不支持前向保密为解决这个问题,后面出现ECDHE秘钥协商算法

#学习#
全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务