C++面试速通宝典——26

478. 你了解的网络攻击方式有哪些?SYN攻击的防范方法?

网络攻击方式包括:

  1. Dos/DDos攻击:通过大量请求耗尽目标资源。
  2. Main-in-the-Middle攻击:攻击者拦截和篡改双方通信。
  3. Phishing:通过假冒网站或通信骗取用户信息。
  4. SQL注入:在数据库查询中注入恶意SQL代码。
  5. 跨站脚本(XSS)攻击:在网页中注入恶意脚本。
  6. Malware:使用恶意软件进行攻击。

SYN攻击(一种Dos攻击)防范方法包括:

  1. SYN Cookies:仅在确认客户端响应后分配资源。
  2. 包过滤:过滤掉异常的或非法的SYN包。
  3. 连接限制:限制打开SYN请求的速率或数量。
  4. 超时设置:降低半开连接的超时时间。

479. epoll、poll、select的区别?epoll为什么高效?

  1. select:它使用位掩码来表示监视的描述符集合,但最大能处理的描述符数目有限制(通常是1024)。
  2. poll:它通过一个链表来存储网络描述符,解决了最大描述符限制问题,但每次调用poll都需要遍历整个链表,效率较低。
  3. epoll:可以理解为变种的poll,它与poll类似,都是使用链表来存储网络描述符,但每当有事件触发时,它只需要获取已经就绪的事件就可以返回了,因此处理的事件少则效率越高。

480. epoll为什么高效?

  1. 回调机制:epoll使用回调的方式,只关注活动的socket,不必每次都轮询所有的被监听的socket。
  2. scalability:epoll具有较好的扩展性,可以处理的socket描述符数量比select和poll都要大。
  3. 减少用户和内核空间之间复制数据的次数

481. MySQL支持的隔离级别是什么?最常用什么?

四种事务隔离级别:

  1. READ UNCOMMITTED : (读未提交)。
  2. READ COMMITTED : (读已提交)。
  3. REPEATABLE READ : (可重复读)。
  4. SERIALIZABLE : (串行化)。

最常用的隔离级别为 REPEATABLE READ(可重复读)。因为他平衡了性能与一致性,同时也是MySQL的默认隔离级别。

482. MySQL索引是主要通过什么数据结构实现的?为什么用B+树?

MySQL索引主要是通过B+树数据结构实现的。

原因:

  1. 高效的读写:对于数据库读写操作频繁的场景,B+树的平衡性能较好,读写性能稳定。
  2. 范围查询优势:B+树支持范围查询,hash表只支持精确查询,而二叉树效率低下。
  3. 磁盘读写优化:B+树的节点大小通常和磁盘扇区大小相同,这样可以最大化磁盘I/O效率。
  4. 减少磁盘I/O次数:B+树的分支因子大,树的层级较低,可以减少在查询过程中磁盘I/O的次数。

483. 虚函数实现机制

‌‌‌‌  C++中的虚函数通过虚函数表实现。

‌‌‌‌  每一个使用虚函数的类都有一个对应的虚函数表,其中存储了指向类的虚函数的指针。每一个对象实例包含一个指向其类的虚函数表的指针(vptr),当调用一个对象的虚函数时,会通过这个指针在虚函数表中查找对应的函数实现进行调用,从而实现多态性。这种机制允许在运行时根据对象的实际类型来动态绑定方法,而不是在编译时

484. const和define的区别

  1. const定义的常量有数据类型,而define是预处理指令,替换文本,没有数据类型。
  2. const有作用域限制,define一直到文件结束或被#undef 指令取消。
  3. const常量通常存储在程序的数据段中,define是简单替换,不分配存储空间。
  4. const常量在调试中可见,因为它们是符号化的,而define替换后的代码通常难以调试。
  5. const是在编译阶段使用,define发生在预处理阶段,编译器还未参与。

485. struct和class的区别

struct和class的主要区别在于默认的访问权限和继承类型:

  1. 默认访问权限:struct中的成员默认是公开类型,而class中的成员默认是私有的。
  2. 默认继承类型:使用struct继承默认是公开继承,而class继承默认是私有继承。

486. 4层负载和7层负载均衡的区别

‌‌‌‌  4层负载均衡工作在传输层,主要关注IP地址和端口,使用TCP/UDP协议进行流量分发。

‌‌‌‌  7层负载均衡工作在应用层,可以处理更高级的协议如HTTP/HTTPS,并且可以基于URL、cookies等因素来进行智能分发。

总的来说,4层负载均衡更关注网络层面,7层负载均衡则提供更细粒度的流量管理能力。

487. 你了解哪些负载均衡方法

负载均衡算法主要有以下几种:

  1. 轮询:请求按照顺序轮流分配到不同的服务器上。
  2. 加权轮询:类似轮询,但服务器有不同的权重。
  3. 最少连接:请求被发送到连接数最少的服务器。
  4. 加权最少连接:考虑服务器权重和连接数,选择最优服务器。
  5. 源地址哈希:根据请求源地址的哈希结果分配请求。
  6. URL哈希:根据请求的URL哈希结果来分配请求。
  7. 最少响应时间:选择响应时间最短的服务器。
  8. 最少带宽:选择当前带宽消耗最少的服务器。

488. malloc的底层原理了解么?涉及到哪些系统调用?

malloc是标准C库中用于动态内存分配的函数。其底层原理涉及到以下几个系统调用:

  1. brk:改变数据段的末尾地址,用于增加或减少数据段的大小。
  2. sbrk:增加进程的程序断点,实际上是对brk的封装。
  3. mmap:创建一个新的映射区域,用于分配大块内存。

‌‌‌‌  malloc通常是通过上述系统调用来向操作系统请求内存,上层的内存分配器使用这些系统调用来管理内存的分配和释放,以及维护内存的数据结构,如空闲列表或者内存池等,来优化内存的使用和减少内存碎片。

489. mmap的原理

mmap是一种将文件或者设备的内容映射到进程的地址空间的机制。其基本原理如下:

  1. 地址空间映射:mmap通过创建一个文件或设备内容与进程虚拟地址空间之间的对应关系,允许进程直接访问这片内存空间。这意味着对这部分内存的读写直接反应到了被映射文件或设备上,无需通过read或write系统调用。
  2. 延迟加载:mmap采用需求分页的方式,实际内存页只有在访问时才被映射到物理内存中,这代表mmap可以有效管理和使用内存,减少不必要的物理内存占用。
  3. 共享与私有:mmap支持共享内存映射和私有映射。共享映射允许不同进程共享同一片内存区域,对这片区域的修改会反映到所有映射了该区域的进程中。私有映射则为每个进程创建映射的副本,进程间的修改互不影响。
  4. 页表:操作系统利用页表来管理这种映射关系,确保进程可以通过虚拟地址访问到正确的物理内存或文件内容。

490. string的底层实现、vector的底层实现

string的底层实现:

  1. 动态数组:string在底层实际上是一个动态数组,用于存储字符序列。
  2. 自动扩容:当字符串内容超过当前分配的内存时,string会自动进行扩容(通常是倍增策略)并拷贝原有数据到新的内存区域。
  3. 短字符串优化(SSO):对于短字符串,为了减少动态内存分配的开销,string会在对象内预留一小段空间,直接在其中存储字符串数组和结尾的空字符’\0’,避免了堆分配。
  4. 复制写时优化(COW,现代C++标准中已废除):在一些旧的实现中,多个string对象可以共享同一个字符数组,只有在修改时才会进行真正的拷贝,以减少内存使用和提升效率。

vector的底层实现:

  1. 动态数组:vector内部同样使用动态数组来存储数据,它支持随机访问。
  2. 自动扩容:当插入的元素超过vector当前的容量时,它会自动重新分配更大的内存空间,并将原有元素复制或移动到新的地址。
  3. 空间预留:vector提供reserve方法,允许手动指定容量,减少不必要的重新分配和数据拷贝。

491. 结构体内存对齐相关

结构体内存对齐是为了提高CPU访问效率而采取的方式

  1. 对齐规则:结构体的每个成员在内存中的起始地址应该是其类型大小的整数倍(例如,int通常是4字节,他的地址应该是4的整数倍)。
  2. 结构体总大小:结构体的总大小为其最大成员类型大小的整数倍。如果不满足,会在结构体末尾进行填充。
  3. 按序排列:结构体成员变量之间可能存在填充(padding),以保证后续成员的地址对齐。
  4. pragma pack(n):可以通过#pragma pack(n)来指定结构体以n字节对齐。n一般为2的次幂。

492. size of 一个 string 变量的结果

‌‌‌‌  sizeof 一个 string 变量通常返回的是string类型固定的大小,而不是字符串内容的长度。这个大小包括string对象中管理字符串所需的所有成员的大小,如指针、长度和容量等,具体的大小取决于实现(例如具体的编译器和其版本)。在某些实现中可能会有短字符优化(SSO),在这种情况下,小的字符串可以直接存储在这个固定大小的内存之中,而无需动态分配。

493. std::move应用场景,和std::forward区别

std::move应用场景:

  1. 主要用于将对象标记为可移动,使之可以被移动构造或移动赋值函数使用。
  2. **应用于转移资源的所有权,**避免不必要的复制,例如移动大型容器或独占所有权的对象(如std::unique_ptr)。

std:move和std::forward的区别:

  1. std::move无条件地将一个对象转换为右值引用,从而允许资源的移动操作
  2. std::forward用于完美转发,在函数模板中,他可以保持参数的值属性(即左值保持左值,右值保持右值),通常与右值引用模板参数结合使用

494. 移动构造函数和复制构造函数的区别

复制构造函数

  1. 创建一个对象的副本
  2. 完成成员逐个复制(深复制)
  3. 原始对象和新对象都拥有自己的独立资源

移动构造函数

  1. 通过接管另一个对象的资源来创建对象(资源转移)
  2. 执行“浅复制”,只是将资源的所有权从源对象转移。
  3. 源对象不再拥有这些资源或处于有效但未定义的状态。

495. push_back和emplace_back对比

push_back:

  1. 接受一个元素作为参数,并将其复制(或移动)到容器末尾。

emplace_back:

  1. 使用所提供的参数直接在容器末尾构造元素
  2. 避免了额外的复制或移动操作

496. push_back可以传入std::move的变量嘛

‌‌‌‌  push_bakc可以接受通过std::move传递的变量,这样可以将变量的资源移动到容器中,而不是复制

497. push_back一个std::move的变量 与 直接emplace_back 性能对比

‌‌‌‌  push_back一个std::move的变量和直接使用emplace_back的性能是相似的,因为他们都是在进行移动操作,而非复制操作。

498. shared_ptr以引用形式传入参数会有什么问题

将shared_ptr以引用形式传递不会增加对象的引用计数,这可能会导致以下问题:

  1. 若函数内部存储或复制了这个引用,而在函数外部原shared_ptr已经被销毁,那么这个存储的引用将成为悬空引用,导致未定义的行为。
  2. 函数调用者可能会期望传递的shared_ptr对象会因函数调用而共享其所有权,但实际上却没有发生。

499. C++的四种类型转换

C++提供了四种类型转换操作符:

  1. static_cast:用于非多态类型的转换,安全性较高的类型转换。
  2. dynamic_cast:用于多态类型的转换,主要用于基类和派生类之间的安全转换。
  3. const_cost:用于去除或添加const或volatile属性。
  4. reinterpret_cast:用于进行低层次的重新解释类型转换,可能是不安全的。

500. explicit关键字的作用,使用场景

explicit关键字用来阻止C++编译器执行隐式类型转换,要求类型转换必须明确无误。使用explicit的典型场景包括:

  1. 防止构造函数的隐式调用,确保只能显式地进行对象初始化。
  2. 防止具有单个参数的构造函数或转换操作符被编译器自动用作隐式类型转换

501. 协程和线程的区别

  1. 线程由操作系统内核管理,协程一般由用户空间的库管理
  2. 线程切换包括内核空间和用户空间的上下文切换,开销较大;协程切换仅包含用户空间的上下文切换,开销较小。
  3. 线程的调度由操作系统内核控制;协程的调度由程序员或库控制,拥有更细粒度的控制能力。
  4. 大量线程会增加系统负担,而大量协程对系统负担较小,可以实现更高的并发性能

502. 共享内存如何使用,原理

共享内存的使用通常包括以下步骤:

  1. 创建共享内存段:一个进程创建一个特定大小的共享内存段。
  2. 将共享内存段附加到进程的地址空间:需要通信的进程将这个共享内存段映射到他们的地址空间。
  3. 使用共享内存:进程可以通过指针和内存操作读写这个内存段。
  4. 分离共享内存段:进程用完后,将共享内存从自己的地址空间分离。
  5. 删除共享内存段:所有进程都不再需要时,最后一个使用的进程应删除共享内存段。

‌‌‌‌  共享内存的原理是提供一块能被多个进程访问的内存区域。操作系统确保这块内存区域在多个进程间是可见的,从而实现非常快速的数据交换。因为它避免了数据的复制操作,直接在物理内存上进行读写。需要注意的是,由于多个进程可以同时访问,通常需要用同步机制(如信号量)来避免竞争条件。

503. 虚拟内存和物理内存在什么时候进行转换?

‌‌‌‌  虚拟内存和物理内存进行转换的时候称为“页映射”,这个过程由操作系统的内存管理单元(MMU)控制。当一个程序试图访问虚拟内存系统时,如果这个地址已经映射到物理内存,MMU将直接转换访问;如果没有映射,操作系统将会触发一个缺页中断,然后加载相应的数据到物理内存,并更新页表以反映新的映射关系,之后访问可以继续进行。这个转换过程对程序是透明的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890899.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL分类中的DDL

DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段)。 一、DDL语句操作数据库 1、查询所有数据库:show databases;(一般用大写&#xff…

spring |Spring Security安全框架 —— 认证流程实现

文章目录 开头简介环境搭建入门使用1、认证1、实体类2、Controller层3、Service层3.1、接口3.2、实现类3.3、实现类:UserDetailsServiceImpl 4、Mapper层3、自定义token认证filter 注意事项小结 开头 Spring Security 官方网址:Spring Security官网 开…

React路由 基本使用 嵌套路由 动态路由 获取路由参数 异步路由 根据配置文件来生成路由

文章目录 React-router的三个版本react-router使用嵌套路由动态路由 获取路由参数Params参数Query参数Location信息 控制跳转地址异步路由根据配置文件生成路由 React-router的三个版本 React-router 服务端渲染使用React-router-dom 浏览器端渲染使用React-router-native Rea…

API项目3:API签名认证

问题引入 我们为开发者提供了接口,却对调用者一无所知 假设我们的服务器只能允许 100 个人同时调用接口。如果有攻击者疯狂地请求这个接口,那是很危险的。一方面这可能会损害安全性,另一方面耗尽服务器性能,影响正常用户的使用。…

若依前后端分离版本el-select下拉框字典如何设置默认值。

在若依前后端分离框架中,如何给下拉框设置默认值,刚入门的小伙伴,可能会不知道如何去做。 本章教程,主要以用户管理模块中的添加用户举例说明如何设置用户性别默认值为男。 解决思路 首先,我们需要找到打开新增页面的方…

【工具】前端js数字金额转中文大写金额

【工具】前端js数字金额转中文大写金额 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金额转…

多功能点击器(文末附Gitee源码)——光遇自动弹奏

之前提到的多功能点击器&#xff0c;使用场景比较多&#xff0c;之前玩光遇喜欢在里面弹琴&#xff0c;想到用这个点击器也能自动弹琴&#xff0c;跟别的自动弹琴脚本不一样&#xff0c;这个比较简单容易操作。 借这个光遇自动弹琴使用教程再讲解一下这个多功能点击头的使用方法…

ModelMapper的常见用法 ,号称是beanUtils.copyProp....的升级版??,代码复制粘贴即可复现效果,so convenient

官网案例 以下将官网案例做一个解释 1&#xff09;快速入门 递归遍历源对象的属性拷贝给目标对象 拷贝对象下对象的属性值 Data class Order {private Customer customer;private Address billingAddress; }Data class Customer {private Name name; }Data class Name {pr…

在三维可视化项目中,B/S和C/S架构该如何选择?

一、什么是B/S和C/S 在3D数据可视化中&#xff0c;有两种常见的架构模式&#xff1a;BS&#xff08;Browser/Server&#xff09;和CS&#xff08;Client/Server&#xff09; B/S模式 B/S模式是指将3D数据可视化的逻辑和处理放在服务器端&#xff0c;而在客户端使用浏览器进行…

智能汽车智能网联

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

rom定制系列------小米6x_MIUI14_安卓13刷机包修改写入以及功能定制 界面预览

在接待一些定制化系统中。有很多工作室或者一些特殊行业的友友需要在已有固件基础上简略修改其中的功能。方便使用。例如usb调试默认开启。usb安装设置以及usb安装与内置删减一些app的定制服务。今天给友友预览其中小米6X此款机型定制相关的一些界面与功能演示。 定制机型以及…

公司新来的00后测试开发,让我对“跨界”二字有了全新认识

最近&#xff0c;我们部门迎来了一位新面孔——一个00后的年轻人&#xff0c;阿沅。初见他时&#xff0c;我以为他只是众多新入职员工中的普通一员&#xff0c;毕竟他的专业背景与我们的IT行业似乎相去甚远——广告学。然而&#xff0c;他的到来&#xff0c;却如同一阵清风&…

IDEA中的Postfix Completion与Live Templates功能详解

目录 前言1. Postfix Completion&#xff08;后缀补全&#xff09;1.1 什么是Postfix Completion1.2 使用Postfix Completion的步骤1.3 Postfix Completion的具体应用1.4 自定义Postfix Completion 2. Live Templates&#xff08;实时模板&#xff09;2.1 什么是Live Templates…

聊聊 Facebook Audience Network 绑定收款账号的问题

大家好&#xff0c;我是牢鹅&#xff01;本篇是Facebook开发者系列的第五篇&#xff0c;最近看见好多群友在群里问这个&#xff0c;说Facebook的变现账户在绑定国内的银行账户时&#xff08;有些用户反馈就算不是国内的卡也会出现该问题&#xff09;&#xff0c;显示“无法绑定…

【WRF工具】QGis插件GIS4WRF:根据嵌套网格生成namelist.wps文件

【WRF工具】QGis插件GIS4WRF:根据嵌套网格生成namelist.wps文件 准备:WRF嵌套网格QGis根据嵌套网格生成namelist.wps文件检查:根据namelist.wps绘制模拟区域参考GIS4WRF 是一个免费且开源的 QGIS 插件,旨在帮助研究人员和从业者进行高级研究天气研究与预报(WRF)模型的建模…

利用可解释性技术增强制造质量预测模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习&#xff08;ML&#xff09;模型性能的方法。该方法已用于铣削质量预测&#xff0c;这一过程首先训练 ML 模型&#xff0c;然后使用可解释性技术识别不需要的特征并去…

Lucene 倒排索引

倒排索引是什么&#xff1f; 【定义】倒排索引&#xff08;Inverted Index&#xff09;是一种用于信息检索的数据结构&#xff0c;尤其适用于文本搜索。它与传统索引的主要区别在于&#xff0c;传统索引是根据文档来查找词语的位置&#xff0c;而倒排索引则是根据词语来查找文…

vmware虚拟机 报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机 的解决方法

打开cpu虚拟化全部进行勾选 ctrl e 进行关机 勾选上打开就好了 如果没有那个选项 关机>打开虚拟机>管理>更改硬件兼容性> 往小处改改> >更改此虚拟机

MySQL连接查询:联合查询

先看我的表结构 emp表 联合查询的关键字&#xff08;union all, union&#xff09; 联合查询 基本语法 select 字段列表 表A union all select 字段列表 表B 例子&#xff1a;将薪资低于5000的员工&#xff0c; 和 年龄大于50 岁的员工全部查询出来 第一种 select * fr…

x-file-storage:一款强大的文件聚合存储解决方案

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 dromara/x-file-storage 是一个由 Dromara 社区开发和维护的开源项目&#xff0c;旨在提供一个高效、可靠的文件存储解决方案。该项目以其强大的功能和…