C++进阶知识复习 31~38

发布于:2025-04-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

目的

写这一系列文章的目的主要是为了秋招时候应对计算机基础问题能够流畅的回答出来 (如果不整理下 磕磕绊绊的回答会被认为是不熟悉)

本文章题目的主要来源来自于 面试鸭
部分面试鸭上没有而牛客网上有的博主会进行查缺补漏

题目编号按照面试鸭官网题号方便大家寻找

题解大部分是博主根据自己之前的博客再加上部分网上的内容进行口语化的表述 如果涉及到省略的部分博主会提供自己或者其他人的博客链接

31. C++中的function bind lambda什么时候会用到

参考博客

包装器


  1. function常用于存储可调用对象 比如说回调函数 事件处理等 我们在写leetcode上的题目-- 逆波兰表达式的时候就可能会用到
  2. bind常用于绑定函数参数 当函数参数不完全的时候使用
  3. lambda表达式为匿名函数 通常用作短期或者一次性使用的函数

32. C++中为什么使用array 它有什么优点

array容器是一个固定大小的序列化容器 它的本质是一个静态数组 当我们要创建一个array对象的时候必须要传入两个参数 一个是类型一个是大小

如果我们明确知道了我们所需要使用到的数组的大小 那么推荐使用array 因为它的效率更高

因为它在栈空间上 固定大小 可以避免缩容扩容的开销

33. 介绍下C++中unique_ptr的原理

参考博客

智能指针


unique_ptr是C++11中新引入的一个智能指针

它的思想是独占所有权 保证资源不会被重复释放

它独占所有权的方式是禁用拷贝构造

34. 介绍C++中的share_ptr 它是线程安全的嘛

参考博客

智能指针


  1. share_ptr通过引用计数来让多个指针管理一个资源 避免重复释放的问题
  2. 它本身是线程安全的 多个对象对其或者对其管理的资源进行操作的时候则不是 这个时候就需要加锁来避免问题

35. 介绍C++中的weak_ptr

参考博客

智能指针


weak_ptr是C++11中提出来的三大智能指针之一 它通过观察资源但不持有资源的方式来解决 shara_ptr的循环引用问题

36. make_share的作用

它是C++中创建智能指针的一种方式有以下优点

  1. 简化代码 代码结构更加清晰
  2. 内存只需要进行一次分配 性能更好
  3. 由于是原子操作 可以在一定情况下避免内存泄漏的问题 比如在下面这个场景下
process(std::shared_ptr<MyClass>(new MyClass()), other_function());

37. 什么是atomic

atomic用于实现变量的原子操作

像是多线程对于一个变量进行访问的时候 这个时候可能会导致数据竞争的问题

这个时候有两种解决方案 一个就是加锁嘛 还有一个就是使用atomic

它的底层是通过cpu的提供的一些原子指令来实现的

相比锁的性能会高效一点

38. 什么时候使用锁 什么时候使用atomic

使用锁的场景

  1. 需要长时间访问临界资源 比如说访问
  2. 当多个共享资源需要同步访问的时候
  3. 当涉及到复杂操作 比如说一次性要对多个变量进行更新

使用atomic的场景

  1. 当操作可以在一个原子步骤内完成 比如说++ –
  2. 当我们对于性能的要求非常高的时候
  3. 实现非阻塞算法的时候 因为原子变量不会导致线程挂起等待锁