自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)
  • 收藏
  • 关注

原创 STL list常见API以及迭代器失效场景,不可以it+2,建议使用next auto it2 = std::next(it1,2);

是C++标准模板库(STL)中的双向链表容器,支持高效的元素插入和删除操作(时间复杂度O(1)),但不支持随机访问(时间复杂度O(n))。的迭代器稳定性是其核心优势之一,适合需要频繁插入/删除且需保持迭代器稳定的场景(如LRU缓存)。✅ 合并(merge)、拼接(splice)操作不会使迭代器失效(迭代器会跟随元素移动)。当删除某个元素时,指向该元素的迭代器会失效,但其他迭代器不受影响。✅ 插入操作不会使任何迭代器失效(包括其他元素的迭代器)。• 避免迭代器失效:插入/删除不会使其他迭代器失效(与。

2025-04-29 13:32:48 760

原创 软链接(ln -s 快捷键) 硬链接(ln,引用别名,指向同一块磁盘地址)

在 Linux 系统中,和都是指向文件的引用,但它们的工作原理和使用场景不同。以下是它们的详细对比和常见的 Linux Shell 指令。

2025-04-22 14:20:51 944

原创 thread_local 线程是全局的智能指针(可以这么理解),存储在TLS(差不多就是数据段),循环引用与线程非正常退出,会内存泄漏,

局部变量:仅在函数内有效,每个线程的栈内存是独立的,不需要特别的机制来管理线程局部数据。变量:适用于需要在多个函数之间共享的线程私有数据,内存通常不在栈上,而是在线程局部存储区中,需要编译器和操作系统提供的额外机制来管理其生命周期。线程局部存储区(TLS, Thread-Local Storage)是用于存储每个线程私有数据的区域。不同于栈和堆内存,TLS 是专门为每个线程分配的,因此每个线程可以访问自己私有的存储区域。TLS存储位置:线程局部存储区的具体实现可能会有所不同,但通常它存储在数据段。

2025-04-22 13:22:34 850

原创 std::sort 为啥不需要 decltype,而 priority_queue 有时却需要,自定义比较大小

sort用的是函数参数,编译器能自动推导类型,不用写类型名;而的比较器是类模板参数,需要提前告诉编译器类型是什么,所以必须用或struct Cmp显式声明。

2025-04-21 17:13:11 211

原创 异或(^)、按位与(&)和逻辑与(&&)

• 找不重复的数字:如LeetCode 136题(其他数字出现两次,找出单次出现的数)。会强制计算两侧表达式(无短路),适合需要副作用的场景。是短路求值,更高效且安全(如避免空指针解引用)。• 简单加密:通过密钥异或数据(可逆操作)。:逻辑条件判断,优先选择(短路特性更安全)。:需要位级操作或数学特性(如交换、去重)。)的区别及使用场景。• 权限控制:用位掩码表示权限组合(如。• 可用于掩码操作(提取特定位)。(用于统计二进制中1的个数)。:位掩码处理或硬件寄存器操作。• 短路求值:若左操作数为。

2025-04-21 16:06:52 432

原创 quic+udp(多路复用,一次握手,解决TCP阻塞顺序阻塞,多路运行)

场景QUIC 的优势移动设备换网不断线(连接迁移)首次加载网站减少 1~2 次 RTT多并发请求不再排队(多路复用)跨国访问UDP 不容易被限速(绕过中间盒)高安全需求强制加密(TLS1.3 内嵌)QUIC 是 Google 推出的基于 UDP 的传输协议,内置了多路复用、TLS1.3 加密、连接迁移等机制,能实现 0-RTT 建连,并彻底解决了 TCP 的队头阻塞问题,是 HTTP/3 的传输基础。

2025-04-21 15:13:50 425

原创 sstream stringstream istringstream ostringstram

功能用法输入字符串流输出字符串流读写字符串流转 int/float 等iss >> x;oss << x;输出拼接内容oss << ...;

2025-04-19 13:19:36 270

原创 可重入函数与不可重入函数

一个函数是可重入的,当它可以在执行过程中被中断,并且之后可以安全地重新进入执行,而不会导致任何错误。换句话说,它可以“同时在多个上下文中执行”。可重入函数:无副作用、无全局变量、只用局部变量、不中断有错。可用于中断处理、信号处理、多线程安全场景,是高并发系统中的基本单元。

2025-04-18 00:32:11 323

原创 单例管理器 + 多态派生类吧你

答案是:✅。

2025-04-17 21:38:16 200

原创 寄存器的值被保存在每个任务自己的任务控制块(TCB)中的一个字段,叫做“上下文保存区”,它实际就是一块内存结构体**,分配在内核空间的 RAM 里。

/ 可选加:cs, ds, fs, gs, ss, cr3 等这就是寄存器值的“落地点”,每个字段就是 RAM 中的某个字节块。保存什么存哪了(在内存)通用寄存器(你定义的结构体)栈指针 ESP(或者指令地址 EIP,或从栈中retiret恢复栈本身内容(你分配的页)

2025-04-17 15:53:11 402

原创 现代任务调度算法红黑树vruntime,谁的vruntime越小谁就是头,随着运行,时间不断增大

现代 Linux 使用CFS(完全公平调度器)作为默认进程调度算法,结合红黑树管理vruntime,让所有进程“尽可能公平”使用 CPU,同时也支持一系列实时调度策略(FIFO、RR、Deadline),适配从桌面到工业控制的多种应用场景。CFS 红黑树结构怎么实现的?vruntime在调度中如何更新?手写一个 toy 内核的 CFS 简化版?或者给你举一个如何在用户态模拟调度器的示例?我可以接着带你深入!🧠。

2025-04-17 15:48:27 294

原创 我还没实现 fork,没有用户程序,我怎么调度第一个任务?它的内存从哪来?第一个任务(进程/线程)是由内核初始化时手动创建的任务控制块(TCB)+ 栈 + 页目录完成的,

你要手动“创造”第一个任务(比如 init/idle task),从页分配器中分配页表、栈,初始化好它的上下文,加入调度器的 ready 队列,再通过或中断调度进入它。初始化第一个任务的 C 模板(带 TCB、分页、栈)switch_to 的汇编代码定时器中断 + lazy context switch 框架我可以立刻贴给你一套 ✅ 你要哪种风格的调度器(协作式还是中断驱动式)?

2025-04-17 15:45:07 368

原创 从 实模式启动 → 保护模式切换 → 加载 ELF → 构建页表启用分页 → 跳转 e_entry

你作为 bootloader,需要负责从磁盘加载 ELF 文件→构造保护模式与页表环境→跳转到e_entry虚拟地址运行内核,整个“从无到有”的链条你都要手动构建!

2025-04-17 15:40:26 219

原创 十进制转任意进制,任意进制转的十进制

【代码】十进制转任意进制,任意进制转的十进制。

2025-04-16 23:01:08 77

原创 hashmap性能优化,红黑树,为啥是8,避免树化开销,左旋,右旋

8原因类型说明📊经验值经过大量实际测试发现,超过 8 个元素时,链表性能严重下降,红黑树开始更快。⚖️平衡考虑如果设置得太小,比如3、5,频繁树化,浪费资源;太大,比如16、32,又查太慢。⚙️实现成本树化有开销,需要一定的计算和内存,必须设个“值当”的阈值。🧮数学直觉log₂(8)=3,意味着查找最多只需 3 次就能找到,比 O(n) 快得多。🚩 注意:链表长度超过 8 并不一定马上变红黑树,还要求数组长度 >= 64,防止小表格早早树化(不划算)。问题简要回答为什么链表要变红黑树?

2025-04-16 09:59:47 794

原创 https加密解密过程,https在加密解密这个过程中怎么处理的,浏览器拿到服务器响应的加密数据,怎么解密的

SSL/TLS 握手客户端和服务器交换支持的协议、加密算法,并验证服务器身份。使用公钥加密和私钥解密交换,最终生成会话密钥。数据传输使用对称加密(如 AES)对数据进行加密和解密,确保数据的机密性。使用消息认证码(MAC)确保数据的完整性,防止数据在传输过程中被篡改。安全性保障身份验证:通过服务器的数字证书,客户端能够验证服务器的身份。机密性:通过加密保护数据的机密性,防止中间人窃听。完整性:通过 MAC 确保数据传输的完整性,防止篡改。

2025-04-16 09:43:51 855

原创 makefile 目标:依赖 规则,可以使用变量,通配符

Makefile 是管理项目构建过程的强大工具,它不仅能简化代码的编译过程,还能确保正确处理文件间的依赖关系。通过合理设计 Makefile,可以有效提高编译效率,避免手动管理文件和命令,尤其在大型项目中,它的作用更加明显。

2025-04-16 00:40:28 820

原创 手撕:消费者和生产者模型

此示例演示了生产者-消费者模型,使用。实现同步,确保线程按顺序执行。

2025-04-15 23:48:27 103

原创 TCP拥塞控制

TCP拥塞控制就是一套智能调速系统,像老司机开车——该猛踩油门时猛踩(慢启动),该点刹时点刹(拥塞避免),发现坑立马绕路(快速重传/恢复)!想象你是一个快递员(TCP),负责把包裹(数据包)从仓库(服务器)送到客户(客户端)。直到客户喊“别发了!快递员发现某次发货后客户没确认(包裹丢了),立刻把发货量减半(比如从20件降到10件),然后慢慢+1件试探。客户本来该收包裹5,但收到4、4、4(重复催单),快递员马上意识到“5丢了”,立刻补发5号包裹。:UDP不管拥塞(可能“堵死”别人),TCP是“文明人”。

2025-04-14 18:04:09 925

原创 任务切换的方法:switch(保护上下文,换新的上下文)+iret(ss,esp,cs,eip)+tss换

任务切换的核心是保存当前任务的上下文(寄存器、栈、eip等),然后加载目标任务的上下文并跳转执行。主流实现分为:手动保存恢复(现代 OS 使用)、使用iret进行特权级切换、以及 TSS 硬件任务切换(已淘汰)。我个人更倾向手写汇编切换 esp/eip 方式,更灵活、性能更高。

2025-04-11 15:14:53 549

原创 C++:main函数之前发生了什么??

顺序事件说明1ELF 加载OS 加载可执行文件,找到入口_start2执行_start来自crt1.o,是启动代码3调用初始化环境、调用构造函数4执行正式进入用户程序5返回后做清理调用析构函数,退出程序这也是为什么你即使 main 什么都没写,程序也会有一些输出或行为—— 因为它前面已经走了好多底层逻辑。这是个经典的 C++ 面试问题,问的是在main()函数执行之前,程序运行了哪些内容。步骤内容举例说明1全局/静态对象构造函数A a;全局变量构造2。

2025-04-11 14:47:56 655

原创 C++:一个程序运行具体过程

一个 C++ 程序从源代码开始,经过预处理、编译、汇编和链接,生成可执行文件。运行时,操作系统通过 execve 加载 ELF 文件到内存,设置好堆栈段,运行 main 函数。运行中会涉及函数栈帧、堆内存管理、C++ 异常机制、构造/析构控制,最终 main 返回后执行 exit 和析构清理,全程由用户态 + 内核态协同完成。要不要我画个图或者写个流程动画 demo,让你讲得更直观?动态链接过程?内存布局?栈帧?execve 和进程创建细节?我可以深入带你梳一遍 🔍。

2025-04-11 14:36:31 666

原创 BIOS MBR启动(0x7c00,读取磁盘loader0x8000) → loader_16实模式(检查内存硬件,准备gdt,开启CR0) → 保护模式过渡 → 加载内核(读磁盘elf,开启分页)

我会写一个 MBR 引导程序,从 BIOS 实模式启动,通过中断读取内核,切换到保护模式,跳转到我写的 32 位 C++入口函数,实现内存管理和任务初始化的最小操作系统。要不要我帮你写一个最小的的完整可运行 demo?可以直接用 qemu 启动验证!

2025-04-11 11:31:16 245

原创 elf,programmer header记录offset与filesize指向vaddr的代码段,数据段等

• 动态链接就像额外要的番茄酱包(需要时才加载)• text/data/bss是不同配料。• 程序头表告诉系统如何加载(怎么吃)• 程序入口就是第一口咬下的位置。• ELF头是包装信息。

2025-04-11 10:55:21 199

原创 一次完整的https请求过程

协商加密方式,建立安全通道(仅 HTTPS 需要)。这样,一次完整的 HTTP(S) 请求就完成了!:释放 TCP 连接(HTTP/1.1 默认。的封装与解析,并最终返回响应。(HTTPS 默认端口)建立可靠连接。:客户端向服务器发送请求(如。:服务器接收请求并返回响应。解析为 IP 地址(如。

2025-04-10 11:04:21 613

原创 TCP->IP->MAC->物理层

•。

2025-04-10 11:01:24 416

原创 Livox Mid360 激光雷达的自主避障(人工势场法,引力和斥力控制机器人移动)

针对,推荐以下几种•(如室内AGV、服务机器人)•(>10Hz)• 将 Mid360 的原始点云用降采样(如 0.1m×0.1m×0.1m),减少数据量。•:障碍物周围产生排斥力(强度随距离递减)。•:目标点产生吸引力。•= 引力 - 斥力,控制机器人移动。• 代码简单(<100行),适合嵌入式设备(如树莓派+Mid360)。• 实时性好,无需预建图。• 可能陷入局部最优(如U型障碍物)。•(如移动机器人避开行人)•(如差速驱动机器人)• 对 Mid360 点云做(如 PCL 的。

2025-04-09 10:34:01 1202

原创 Fast-LIO 超简单版解释

→ 像小哥的“平衡车”,每秒更新 100-500 次位置猜测(但会飘移)。→ 像小哥的“高精度地图”,每 0.1 秒扫描一次周围环境(但速度慢)。• 把新扫描到的环境特征,存到“智能地图”(体素地图)里,下次比对更快。• 小哥踩着平衡车,靠感觉(加速度/角速度)猜自己现在在哪。:在抖动、黑暗、无 GPS 时也能工作(比如无人机钻隧道)。:每秒更新 100+ 次位置(比纯激光快 10 倍)。:猜得越多,误差越大(像蒙眼走路会歪)。(紧耦合),不像其他小哥各干各的。(体素),找路时不用翻全部地图。

2025-04-09 10:30:55 327

原创 为什么 Python 多线程不适合图像处理?(多进程)或(生产,消费者模型,任务队列)或 GPU加速(CUDA)

在 Python 中,threading,主要原因与和有关。•Python 的 GIL 确保同一时刻只有一个线程执行 Python 字节码(即使有多个 CPU 核心)。(如矩阵运算、滤波、特征提取),线程会被 GIL 阻塞,无法真正并行。•用多线程处理图像时,CPU 使用率可能仅,而无法利用多核。• Python 的线程是,但 GIL 会导致频繁的线程切换(上下文切换),反而增加额外开销。•:每个进程有独立的 Python 解释器和内存空间,可真正利用多核。••joblib••。

2025-04-09 10:26:26 563

原创 mid360内置 IMU(惯性测量单元)校正雷达自身运动导致的点云畸变与点云过滤(计算临域距离)

这一技术显著提升了移动平台(如自动驾驶车辆、无人机)的点云质量,但需注意IMU的短时特性,长期导航仍需结合其他传感器(如GPS、轮速计)。激光雷达在扫描时(尤其是旋转式雷达),如果自身处于运动状态(如车载、机器人移动),会导致点云产生。• 对移动物体(如车辆、行人)的点云,结合聚类或深度学习算法分离,避免误补偿。将空间划分为立方体(体素),每个体素内保留一个代表点(如重心或最近点)。低反射率(如<10%)目标的回波可能被抑制(如黑色物体、透明玻璃)。静态环境(如仓库巡检)中移除固定背景(如墙壁、货架)。

2025-04-09 09:52:33 977

原创 mid360的快问快答

多个激光二极管(VCSEL 或 EEL)发射红外激光(通常 905nm 或 1550nm)。• 机器人导航(如服务机器人、AGV)、自动驾驶(L2–L4)、测绘、安防等。原始数据(距离、角度)通过坐标系变换(极坐标→笛卡尔坐标)生成 3D 点云。:APD(雪崩光电二极管)或 SPAD(单光子雪崩二极管)接收反射光信号。,随着时间推移,点云密度逐渐提高(类似 “填色” 过程)。:点云密度接近高线数雷达(如 64/128 线)。:稀疏点云,类似低线数雷达(如 32 线)。

2025-04-09 09:43:19 960

原创 leecode unordered_map与unordered_set常见接口函数

和 的 核心设计思想相似(均基于哈希表实现,提供 O(1) 平均时间复杂度的查找),但它们的 API 并不完全相同,主要区别源于二者用途不同:• 存储键值对(),需通过键访问值。• 仅存储键(),用于快速判断元素是否存在。以下 API 在两者中功能一致:• 提供 和 直接访问值: 没有这些接口,因为它不存储值。• 的迭代器指向 ,需用 和 访问键和值:• 的迭代器直接指向 :(3)初始化与插入• 插入键值对需用 :• 只需插入键:3. 何时选择?• 用 :需要建

2025-04-08 19:21:29 220

原创 阻止类被实例化,纯虚函数,私有构造函数,删除默认构造函数

在面向对象编程中,有时我们需要阻止一个类被实例化。

2025-04-07 17:03:27 131

原创 静态类型vs动态类型(int i c++和 i python的区别,一个编译时确定,一个运行时确定) 静态绑定vs动态绑定(多态的两种实现方式)

项目静态类型动态类型类型绑定时机编译时运行时类型安全编译器保证程序员保证性能高(可优化)较低灵活性较低高出错时机编译期运行期项目静态绑定动态绑定函数决定时机编译期运行期是否支持多态否✅ 是性能快稍慢(需查 vtable)是否用virtual❌ 否✅ 必须概念是谁的类型?决定时机静态类型变量的类型编译期固定动态类型变量的类型运行期决定静态绑定调用哪个函数编译期决定动态绑定调用哪个函数运行期决定(虚函数)

2025-04-07 15:37:05 614

原创 什么时候必须使用初始化列表?const,&,基类构造需要参数,多继承中虚基类构造等

只要你遇到 const、引用、没有默认构造函数的成员、需要给基类传参 —— 统统必须用初始化列表!

2025-04-07 15:16:16 289

原创 C++ 异常处理的三大核心关键词:`try`、`catch`、`throw`

关键词作用throw抛出异常(出错时执行)try标记一段可能抛异常的代码块catch捕获并处理异常try 是防火墙,throw 是爆炸点,catch 是灭火器。给你讲讲 C++11/17 中异常的优化机制(noexcept替代异常)写一个小型异常封装库(适合实际工程)或者讲讲异常在底层是怎么实现的(栈展开、typeinfo、RTTI)你感兴趣哪个方向?😎。

2025-04-07 14:02:24 386

原创 C++和python的区别

Python 上手快、功能强、开发效率高;C++ 性能极致、控制精细、更贴近底层。

2025-04-07 13:07:49 285

原创 简单工厂模式

情况建议使用你不想暴露具体类的创建细节✅ 使用工厂类的实例化逻辑比较复杂✅ 使用工厂产品种类会扩展或变化✅ 工厂方法优于简单工厂需要创建产品族(多个相关产品)✅ 抽象工厂模式。

2025-04-07 12:33:01 223

原创 悲观锁和乐观锁

对比项悲观锁乐观锁思维模式默认会冲突默认不会冲突是否加锁是(阻塞)否(非阻塞)实现方式mutexrwlock等CAS, 版本号,时间戳性能特点冲突多时稳定冲突少时快,冲突多性能下降成功概率一般都能成功可能失败需重试使用场景高冲突区,如数据库写操作高并发低冲突,如计数器、自旋队列。

2025-04-02 09:44:33 344

原创 printf的实现,va_list读取参数,vsprintf进行将%s,%d这些参数的值转化为字符串并一起输出到缓存区

【代码】printf的实现,va_list读取参数,vsprintf进行将%s,%d这些参数的值转化为字符串并一起输出到缓存区。

2025-04-01 17:58:42 91

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除