C++面试速通宝典——14
220. static关键字的作用
static关键字在编程中有多种作用:
- 在类的成员变量前使用,表示该变量属于类本身,而不是任何类的实例。
- 在类的成员函数前使用,表示该函数不需要对象实例即可调用,且只能访问类的静态成员变量和其他静态成员函数。
- 在局部变量前使用,表示该变量在函数调用结束后不会被销毁,而是保持其值不变。
- 在全局变量或函数前使用,限制其作用范围仅在定义的文件内,对其他文件不可见。
221. extern关键字的作用
- 允许在多个文件中访问同一个全局变量或者函数
- 表明变量或函数的定义存在于其他文件中
222. 静态内存分配和动态内存分配的区别,静态分配的优缺点
静态内存分配与动态内存分配的区别:
- 静态内存分配在编译时就确定了存储空间的大小和生命周期,通常用于全局变量和静态局部变量。
- 动态内存分配在运行时根据需要动态的分配和释放内存,通常使用new和delete。
静态内存分配的优点:
- 管理简单,没有额外的运行开销。
- 生命周期长,随程序启动创建,程序结束时销毁。
静态内存分配的缺点:
- 灵活性低,必须提前预知并定义所需内存大小。
- 可能会导致内存浪费,若预分配内存未被充分利用。
223. 互斥锁和自旋锁的区别?
互斥锁:
当一个线程获得互斥锁后,其他尝试获得该锁的线程会被挂起(阻塞),直到锁被释放。适用于线程执行时间较长的情况。
自旋锁:
当一个线程尝试获取自旋锁而锁已被占用时,线程会循环等待(自旋),直到锁被释放。适用于线程执行时间非常短的情况,避免了线程挂起的开销。
224. 线程和进程的区别
进程是操作系统进行资源分配和调度的基本单位,每个进程拥有独立的地址空间和系统资源。线程是进程中的执行单元,是CPU调度的基本单位,同一进程中的线程共享该进程的地址空间和资源。
225. 如何进行线程切换的?
线程切换是操作系统的调度器通过保存当前线程的状态到线程的上下文中,然后加载另一个线程的上下文并恢复其状态,这样CPU就可以继续执行新线程的处理。
226. IP寄存器的作用,是通用寄存器么?
IP寄存器,即指令寄存器(在x86架构中称为EIP,在x64架构中称为RIP),其作用是存储下一跳要执行的命令。他不是通用寄存器,因为他有特定的用途,即指向程序的下一条指令,而不能用于通用数据存储或算术逻辑运算。
227. LR寄存器了解么?
LR寄存器是链接寄存器,在ARM架构中常见。他用于存储子程序调用返回后执行的下一条指令的地址,返回地址会存入LR寄存器。这样,在子程序执行完毕后可以通过LR寄存器找到并返回到调用点继续执行。LR寄存器不是通用寄存器。
228. 线程有哪几种状态?
创建(New),就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)、终止(Terminated)。
229. 自旋锁等待时线程处于什么状态?互斥锁呢?
自旋锁等待时线程处于运行状态,因为他在忙等待,不停的检查锁是否可用。
互斥锁等待时,线程处于阻塞状态,不占用CPU资源,直到锁成为可用状态。
230. 讲一下你了解的进程调度算法
进程调度算法是决定哪个进程将接下来使用CPU的规则集合。常见的进程调度算法包括:
- 先来先服务(FCFS):按照进程到达的顺序进行调度
- 最短作业优先(SJF):先执行预计运行时间最短的进程。
- 优先级调度:优先执行优先级最高的进程
- 轮转调度(Round Robin,RR):每个进程分配时间片,轮流执行
- 多级反馈队列(Multilevel Feedback Queue,,MFQ):动态调整进程的优先级和时间片。
231. 讲一下C++的智能指针
unique_ptr
:独占所有权,不支持复制和赋值操作。
shared_ptr
:引用计数机制,多个智能指针可以共享一个对象。
weak_ptr
:不对对象的所有权计数,用于解决shared_ptr的循环引用的问题。
232. shared_ptr的底层实现了解么?
shared_ptr底层实现通常包括两个主要部分:
- 控制块:存储引用计数和指向动态分配的对象的指针。
- 智能指针对象:包含对控制块的引用。
233. 讲一下lambda表达式,lambda表达式优点和应用场景
Lambda表达式是C++中的匿名函数,让你能够写出内联的、可调用的代码块,可以捕获并使用其所在作用域中的变量。
优点:
- 简洁:减少了编写单独函数或函数对象的必要
- 方便:可直接在需要的地方定义和使用
- 灵活:能够捕获所在作用域的变量
应用场景:
- 作为回调函数,例如给线程或算法传参
- 在STL算法中,用于自定义排序准则或操作
- 用于定义局部的小功能块,避免编写多余的函数
234. map和unordered_map的区别
map和unordered_map的区别:
map:基于红黑树实现,元素按键自动排序,查找、插入和删除操作的时间复杂度为O(logn)
unordered_map:基于哈希表实现,元素不排序,按哈希值存储;平均情况下查找、插入和删除操作的时间复杂度为O(1),最坏情况为O(n)
235. unordered_map实现了解么?
unordered_map通过哈希表实现。它使用一个哈希函数将键值映射到桶中,并在桶内使用链表处理哈希冲突。当发生哈希冲突时,即多个元素映射到同一个桶,这些元素会以链表的形式存储在该桶中。这样可以通过键的哈希值快速访问到对应的桶,从而进行元素的查找、插入和删除。
236. 哈希冲突是指什么?
哈希冲突是指不同的键通过哈希函数计算后得到相同的哈希值,因此他们被映射到同一个哈希表的存储位置上。
237. 讲一下TCP三次握手
TCP三次握手的过程:
- 客户端发送一个含有
SYN
标志的数据包给服务器,请求连接 - 服务器收到
SYN
包,回应一个含有SYN/ACK
标志的数据包,表示确认 - 客户端收到
SYN/ACK
包,再发送一个ACK
包给服务器,完成连接建立
238. http协议和TCP协议的关系
HTTP协议运行在TCP协议之上,使用TCP提供可靠传输服务来确保数据正确无误的从客户端传输到服务器,或者反过来。
239. https协议和http协议的关系
HTTPS是HTTP协议的安全版本,它通过SSL/TLS
协议提供加密处理数据的功能,保证数据传输的安全性和完整性。
240. 内存分配情况,存放在哪里?
- 堆:动态分配内存,用于存放动态分配的对象
- 栈:自动分配释放,用于存放函数局部变量和函数参数。
- 数据区:存放全局变量和静态变量
- 代码区:存放程序的执行代码
241. 函数参数传递的方式和特点
- 值传递:函数接收参数值的一个版本,原始数据不会被函数修改
- 引用传递:函数接收参数的内存地址(引用),可以直接修改原始数据
242. static和const的区别
static
关键字用来定义静态变量,其生命周期为程序执行期间,但它的作用域限定于定义它的文件或函数内。
const
关键字定义常量,其值在定义后不能被修改,用来保证数据的不变性。他只影响它所修饰的变量的可变性,而不影响其生命周期。
243. static修饰局部变量、全局变量、函数和类各有什么特点?
- 静态局部变量:存储在数据区,生命周期贯穿程序执行期,但只在定义它的函数内可见。
- 静态全局变量:作用域限定于定义它的文件内,对其他文件不可见。
- 静态函数:其链接属性为内部,只能在定义它的文件内使用。
- 静态类成员:属于类本身,而不是类的任何对象,所有对象共享同一个静态成员。
解释:
可能你跟我一样,有种疑问,静态局部变量(static
本地变量)在程序的执行期间都保持存活(生命周期),但只在定义它的函数内可见(作用域)。它们听上去似乎会占用过多的系统资源,但它们有其特定的用途和优点:
静态局部变量的特性
- 生命周期:静态局部变量的生命周期是从程序开始执行到程序结束,生命周期超级长。
- 作用域:它的作用域局限于定义它的函数,换句话说,只能在函数内访问。
为什么需要静态局部变量
- 保持状态:
静态局部变量用于保持函数内部的状态信息。例如,可以用它们来记住函数被调用的次数:
#include <iostream>
void counter() { static int count = 0; count++; std::cout << "Function called " << count << " times\n";
}
int main() { counter(); counter(); counter(); return 0;
} // 输出: // Function called 1 times // Function called 2 times // Function called 3 times
-
优化性能:
对于某些计算密集的任务,静态局部变量可以用作缓存以避免重复计算,从而提高性能。 -
数据持久性:
数据需要在多次函数调用之间保持一致而不需要全局变量时,静态局部变量是一个好用的选择。它能保护局部状态,而无需暴露在全局作用域。
内存占用考虑
-
静态局部变量的内存分配:
静态局部变量在程序的全局数据区(通常称为BSS段或数据段)中分配内存,与堆栈和堆上的变量不同。这种内存分配在编译时进行,因此程序启动时其大小是固定的。 -
资源占用:
虽然它们确实在整个程序生命周期内占用资源,但它们的使用方式通常非常有限,并且在大多数场景中相比较其带来的好处(如状态保持、性能提升等),这点内存消耗是可以接受的。
何时使用静态局部变量
-
需要在多次调用之间保持函数内部状态:
当你希望一个函数保持一些数据或状态信息,以便在下次调用时继续使用这些信息,静态局部变量是理想的选择。 -
不希望全局变量污染命名空间:
静态局部变量提供了一种在函数内部保持状态信息而不需要全局变量的方法,避免了命名冲突和潜在的全局变量滥用。 -
需要持久化缓存或中间结果:
当某些中间计算结果需要被多次使用时,静态局部变量能减少不必要的重新计算,例如在复杂算法或递归过程中。
#include <iostream>
int heavyComputation() { // 假设这是一个很复杂的初始化计算 return 42;
}
int computeSomething() { static int cachedResult = heavyComputation(); // 只会在第一次调用时初始化 return cachedResult + 10; // 假设一个计算操作
}
int main() { std::cout << computeSomething() << "\n"; // 输出: 52 std::cout << computeSomething() << "\n"; // 输出: 52,再次调用时,cachedResult不会被重新计算 return 0;
}
在这个例子中,cachedResult
静态局部变量保留了 heavyComputation()
的计算结果,因此后续 computeSomething()
的调用不需要再次进行复杂的计算。
244. new和malloc、free和delete的区别
- new和delete是C++中用于动态内存分配和释放的操作符,new在分配内存的同时调用构造函数初始化对象,delete释放内存前调用对象的析构函数
- malloc和free是C语言中的用于动态内存分配和释放的函数,malloc只分配内存,不初始化,free只释放内存,不调用析构函数。
245. 指针和引用的区别
- 指针是一个变量,其值为另一个变量的内存地址,通过地址,可以直接直接访问和修改对应内存中的值。
- 引用是别名,他为对象提供了一个新的名字,对引用的操作等同于对对象本身的操作。
- 指针可以为空,引用必须得绑定到一个对象。
- 指针的值(即所指对象的地址)可以改变,但引用一旦与某个对象绑定,就不能再改变引用到其他对象。
246. 深拷贝和浅拷贝
浅拷贝指的是复制对象的引用,而不是对象本身,因此原始对象和副本对象共享同一块内存地址。
深拷贝则是复制对象及其包含的所有对象,副本和原始对象在内存中完全独立。
247. 进程间通信,管道的特点
- 半双工通信:数据只能单向流动,如果需要双向通信,需要创建两个管道。
- 数据流动是顺序的和阻塞的:数据按照发送的顺序接受,如果管道空则读操作阻塞,如果管道满则写操作阻塞。
- 管道是用于有亲缘关系的进程间通信,如父子进程通信。
248. define特点,怎么定义一个a+b的宏
特点:
- 预处理阶段进行文本替换,不涉及类型检查
- 可以定义常量和宏,提高代码复用性
- 宏可以包含参数,但不进行正确性检查
定义一个执行a+b的宏,如下所示:
#define ADD(a+b) ((a)+(b))
这里的(a)和(b)被括起来是为了避免展开时出现的运算优先级问题
249. sizeof和strlen区别
sizeof
是一个编译时运算符,用来得到某个类型或变量在内存中的大小,单位是字节strlen
是一个运行时函数,用来计算字符串的长度,直到遇到第一个空字符’\0’,不包括’\0’。
250. 虚函数的特点
- 支持动态多态性:允许通过基类指针或引用调用派生类的函数。
- 运行时绑定:函数调用在运行时解析,而非编译时
- 存在虚表(vtable):每个有虚函数的类都有一个虚表
- 可以被派生类重写:派生类可以提供自己的虚函数实现
- 必须至少有一个函数体,除非声明为纯虚函数
251. 父类子类构造析构函数调用顺序
- 构造函数调用顺序:首先调用父类构造函数,然后调用子类构造函数。
- 析构函数调用顺序:首先调用子类析构函数,然后调用父类析构函数。
252. 构造析构能否抛出异常?能否是虚函数?
构造函数和析构函数都可以抛出异常,但应该谨慎处理,以避免可能导致的资源泄露或不一致状态。
构造函数不能是虚函数,因为虚函数表在构造时尚未建立。析构函数可以是虚函数,通常在基类中将析构函数声明为虚析构函数,以确保通过基类指针删除派生类对象时,能正确调用派生类的析构函数。
253. 内存对齐
C++内存对齐是为了提高内存访问效率,确保数据结构按照某个固定长度(对齐界限)存储。编译器会自动添加填充字节(padding),使得结构体的每个成员相对于结构体开始位置的偏移量是成员大小或某个特定数值(通常是2的幂)的整数倍。
相关文章:

C++面试速通宝典——14
220. static关键字的作用 static关键字在编程中有多种作用: 在类的成员变量前使用,表示该变量属于类本身,而不是任何类的实例。在类的成员函数前使用,表示该函数不需要对象实例即可调用,且只能访问类的静…...

k8s的简介和部署
一、k8s简介 在部署应用程序的方式上面,主要经历了三个阶段: 传统部署:互联网早期,会直接将应用程序部署在物理机上优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源&…...

Thingsboard 网关实战 modbus通信 rpc下发控制指令
我们这里说的是Thingsboard通过网关modbus通信接入设备,然后通过rpc下发指令去控制开关信号的设备,不会网关通过modbus接入设备的,可以看我之前的文章,从小白教学。 下面我们就说如何下发rpc开关信号指令 第一步.在modbus配置文…...

基于pytorch的手写数字识别
import pandas as pd import numpy as np import torch import matplotlib import matplotlib.pyplot as plt from torch.utils.data import TensorDataset, DataLoadermatplotlib.use(tkAgg)# 设置图形配置 config {"font.family": serif,"mathtext.fontset&q…...

MySQL 实验 7:索引的操作
MySQL 实验 7:索引的操作 索引是对数据表中一列或多列的值进行排序的一种结构,索引可以大大提高 MySQL 的检索速度。合理使用索引,可以大大提升 SQL 查询的性能。 索引好比是一本书前面的目录,假如我们需要从书籍查找与 xx 相关…...

为Floorp浏览器添加搜索引擎及搜索栏相关设置. 2024-10-05
Floorp浏览器开源项目地址: https://github.com/floorp-Projects/floorp/ 1.第一步 为Floorp浏览器添加搜索栏 (1.工具栏空白处 次键选择 定制工具栏 (2. 把 搜索框 拖动至工具栏 2.添加搜索引擎 以添加 搜狗搜索 为例 (1.访问 搜索引擎网址 搜狗搜索引擎 - 上网从搜狗开始 (2…...

如何设置WSL Ubuntu在Windows开机时自动启动
如何设置WSL Ubuntu在Windows开机时自动启动 步骤详解1. 创建批处理脚本2. 添加到Windows启动项 注意事项结语 在使用Windows Subsystem for Linux (WSL) 时,我们可能希望Ubuntu能够在Windows启动时自动运行。本文将介绍如何实现这一功能,让您的开发环境更加便捷。 步骤详解 …...

使用TensorBoard可视化模型
目录 TensorBoard简介 神经网络模型 可视化 轮次-损失曲线 轮次-准确率曲线 轮次-学习率曲线 迭代-评估准确率曲线 迭代-评估损失曲线 TensorBoard简介 TensorBoard是一款出色的交互式的模型可视化工具。安装TensorFlow时,会自动安装TensorBoard。如图: TensorFlow可…...

《深度学习》OpenCV 图像拼接 原理、参数解析、案例实现
目录 一、图像拼接 1、直接看案例 图1与图2展示: 合并完结果: 2、什么是图像拼接 3、图像拼接步骤 1)加载图像 2)特征点检测与描述 3)特征点匹配 4)图像配准 5)图像变换和拼接 6&am…...

Hive数仓操作(三)
一、Hive 数据库操作 1. 创建数据库 基本创建数据库命令: CREATE DATABASE bigdata;说明: 数据库会在 HDFS 中以目录的形式创建和保存,数据库名称会存储在 Hive 的元数据中。如果不指定目录,数据库将在 /user/hive/warehouse 下…...

TDSQL-C电商可视化,重塑电商决策新纪元
前言: 在数字化浪潮席卷全球的今天,电子商务行业以其独特的魅力和无限潜力,成为了推动全球经济增长的重要引擎。然而,随着业务规模的急剧扩张,海量数据的涌现给电商企业带来了前所未有的挑战与机遇。如何高效地处理、…...

翔云 OCR:发票识别与验真
在数字化时代,高效处理大量文档和数据成为企业和个人的迫切需求。翔云 OCR 作为一款强大的光学字符识别工具,在发票识别及验真方面表现出色,为我们带来了极大的便利。 一、翔云 OCR 简介 翔云 OCR 是一款基于先进的人工智能技术开发的文字识别…...

HTML ASCII:Web 开发中的字符编码基础
HTML ASCII:Web 开发中的字符编码基础 ASCII,全称为美国信息交换标准代码(American Standard Code for Information Interchange),是一种用于电子通信的字符编码标准。它最初于1963年提出,用于在不同的计算…...

Meta 首个多模态大模型一键启动!首个多针刺绣数据集上线,含超 30k 张图片
小扎在 Meta Connect 2024 主题演讲中宣布推出首个多模态大模型 Llama 3.2 vision!该模型有 11B 和 90B 两个版本,成为首批支持多模态任务的 Llama 系列模型,根据官方数据,这两个开原模型的性能已超越闭源模型。 小编已经迫不及待…...

阿里云ECS服务器仿真
1.首先使用qemu-img对RAW镜像进行转换,qemu-img convert -O vmdk 1.raw 2.vmdk 2.使用WinHex对镜像的root密码进行删除 3.由于这次阿里云ECS使用了CONFIG_SYSTEM_TRUSTED_KEYS验证,无法直接仿真,需使用live系统对内核进行修改。分为以下几步&…...

如何为树莓派安装操作系统,以及远程操控树莓派的两种方法,无线操控和插网线操控
文章目录 一、下载树莓派的系统二、将文件下载到SD卡中1.使用官方软件2.其他选择 三、远程连接电脑安装vnc-viewer1.无线操作(配置树莓派,开启VNC)电脑远程配置2.有线连接(需要一根网线) 总结 一、下载树莓派的系统 下…...

【最新华为OD机试E卷-支持在线评测】简单的自动曝光(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

每日一练:等差数列划分
413. 等差数列划分 - 力扣(LeetCode) 题目要求: 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给…...

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)
前言 随着kotlin代码跨平台方案的推出,kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪,作为一个敏捷型开发的公司,依然少不了Android和iOS的同步开发,实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平…...

unity 默认渲染管线材质球的材质通道,材质球的材质通道
标准渲染管线——材质球的材质通道 文档,与内容无关,是介绍材质球的属性的。 https://docs.unity3d.com/2022.1/Documentation/Manual/StandardShaderMaterialParameters.html游戏资源中常见的贴图类型 https://zhuanlan.zhihu.com/p/260973533 十大贴图…...

PostgreSQL升级:使用pg_upgrade进行大版本(16.3)升级(17.0)
1.pg_upgrade工具介绍 pg_upgrade 会创建新的系统表,并以重用旧的数据文件的方式进行升级。 pg_upgrade 的参数选项如下: -b bindir,--old-bindirbindir:旧的 PostgreSQL 可执行文件目录; -B bindir,--new-…...

userdel命令:删除指定Linux用户
一、命令简介 userdel 命令用于删除 Linux 系统中的用户账号。当您不再需要某个用户账号时,可以使用 userdel 命令将其从系统中删除。 二、命令参数 userdel [选项] 用户名一些常用的选项包括: -r, --remove: 删除用户的家目录及邮件目录。…...

QT系统学习篇(1)
一、什么是Qt、Qt的优势 QT是一个跨平台的C图形用户界面库,目前包括Qt Creator、Qt Designer等等快速开发工具。支持所有Linux/Unix系统,还支持windows平台。Qt很容易扩展,并且允许真正的组件编程。(军工企业项目开发基本离不开Q…...

每日一刷——9.26——ACM训练题——Fibonacci Again
题目描述: There are another kind of Fibonacci numbers: F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word "yes" if 3 d…...

代码随想录 | Day28 | 回溯算法:组合组合总和III
代码随想录 | Day28 | 回溯算法:组合&&组合总和III 关于这个章节,大家最好是对递归函数的理解要比较到位,听着b站视频课可能呢才舒服点,可以先去搜一搜关于递归函数的讲解,理解,再开始这个章节会比…...

【重学 MySQL】四十五、数据库的创建、修改与删除
【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…...

STM32驱动直流电机
stm32通过PWM控制直流电机的方向和速度。 小直流电机需要几百毫安的电流,单片机只能提供几毫安的电流。电机内线圈转动时切割磁感线以及电机内转子线圈的电感效应都会产生反电动势,损坏芯片。 电机驱动芯片能够作为STM32驱动电机的帮手。 SLEEP暂停工作…...

【C++】二叉搜索树+变身 = AVL树
🚀个人主页:小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋:插入新节点后单纯的右边高2.2.2 …...

Flutter String 按 ,。分割
在 Flutter 中,如果你想将一个字符串按特定的字符(例如中文逗号 , 和英文句号 .)进行分割,可以使用 Dart 语言的字符串处理功能。具体来说,你可以使用 split 方法,并传入一个正则表达式来匹配这…...

Redis: 集群高可用之MOVED转向和ASK转向解决方案
MOVED转向 1 ) 问题描述 在客户端操作Redis集群的时候 MOVED转向 或 MOVED错误是经常遇到的一类问题我们先连入集群:$ /usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.101 -p 6371之前在Redis中存储过一些数据,比如下面的情况,当输…...