2020-12-28 微信支付二面

1.C++的写时拷贝?

写时拷贝,按其意思来说就是在“写”(修改)的时候进行拷贝,它要实现的是既不浪费空间,又不使同一空块空间析构多次;因此它才用引用计数的方法来实现写时拷贝;(以string类为例)
在这里插入图片描述
https://blog.csdn.net/qq_38117478/article/details/76379788

以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体;
一个对象以值传递的方式从函数返回;
一个对象需要通过另外一个对象进行初始化。

浅拷贝:位拷贝,拷贝构造函数,赋值重载
多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏
深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。

浅拷贝的陷阱
在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。
缺省拷贝构造函数在拷贝过程中是按字节复制的,对于指针型成员变量只复制指针本身,而不复制指针所指向的目标–浅拷贝

https://blog.csdn.net/weixin_41143631/article/details/81486817


2.C++的std::move?

在C++11中,标准库在中提供了一个有用的函数std::move,std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

std::move函数可以以非常简单的方式将左值引用转换为右值引用。

通过std::move,可以避免不必要的拷贝操作。

std::move是为性能而生。

std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

https://blog.csdn.net/fengbingchun/article/details/52558914


3.C++的智能指针?

以下四个智能指针是我们常用的智能指针
1.auto_ptr 管理权转移,带有缺陷的设计。尽量不要使用它
2.unique_ptr 防拷贝,高效简洁。不需要拷贝/赋值,尽量使用它
3.shared_ptr 共享(引用计数)管理、支持赋值/拷贝。缺陷:循环使用(针对循环使用有weak_ptr).
4.weak_ptr辅助shared_ptr解决循环引用,不增加引用计数。

https://blog.csdn.net/lvyibin890/article/details/73252161


4.C++代码编译流程?

C/C++编译过程主要分为4个过程

  1. 编译预处理
  2. 编译、优化阶段
  3. 汇编过程
  4. 链接程序

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);
在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,
使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接 在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。
这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
C/C++编译过程对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。

https://www.cnblogs.com/mickole/articles/3659112.html


5.C++的socket编程?

网络编程入门:https://github.com/chenshuo/muduo


6.TCP网络状态机?

在这里插入图片描述
https://zhuanlan.zhihu.com/p/98821434


7.gRPC框架?

gRPC特点
   在gRPC的客户端应用可以像调用本地对象一样直接调用另一台不同的机器上的服务端的应用的对象或者方法,这样在创建分布式应用的时候更容易。下面看看gRPC的特点:

1. 语言无关,支持多种语言;

2. 基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub;

3. 通信协议基于标准的 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;

4. 序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

https://www.cnblogs.com/songgj/p/13463717.html


猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/111878464
今日推荐