自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 想走c++后端开发方向,如何规划学习才能成功上岸?

想走c++后端开发方向,如何规划学习才能成功上岸?

2023-07-11 16:23:53 1588

原创 转行音视频开发,怎么做?需要学哪些技术

快速入门音视频技术的方法,有吗? 资料如何快速查找

2023-02-18 17:26:40 1514 1

原创 Qt开发必备技术栈学习路线和资料

Qt开发必备技术栈学习路线和资料

2022-10-31 20:37:21 8409 3

原创 Linux 网络编程核心:环形缓冲区的设计与实现

环形缓冲区,光听名字就能脑补出它的大致形态——它物理上是一段连续的内存空间,逻辑上却能实现首尾衔接,像个循环的环。在这个环形的世界里,数据遵循 FIFO(先进先出)的原则进行存储和读取,就像排队一样,先来的先处理。它通过一对读写指针来管理数据的进出,写指针指向数据写入的位置,读指针指向数据读取的位置。当写指针到达缓冲区末尾时,会自动回到开头继续写入;读指针也是如此。这种独特的设计,使得它能够高效地循环复用内存空间,避免了传统缓冲区的诸多问题,成为了解决生产者 - 消费者模型中速度差异的有力工具。

2026-04-07 15:07:02 336

原创 Linux内核Page Cache全景解析

聊Page Cache之前,先给大家建立一个直观认知:Linux系统中,内存的读写速度是磁盘的上千倍,内核为了填平这层速度鸿沟,特意在内存中开辟了一块“专属缓存区”,这就是Page Cache(页高速缓冲存储器),相当于给磁盘数据建了个“内存中转站”。从本质上讲,Page Cache是内核专门用于缓存文件数据的内存区域,64位系统默认以8KB为单位(32位系统4KB),和内存页大小保持一致,这样能最大程度减少内存与磁盘的数据交换开销。

2026-04-01 16:50:11 366

原创 搞懂 Linux 进程调度核心:一睡眠与唤醒的底层逻辑

作为一名 Linux 开发领域的博主,发现进程阻塞和资源等待问题简直是大家的 “心头大患”。就拿网络 I/O 操作来说,当我们的程序发起网络请求后,数据传输需要时间,这期间进程若一直占用 CPU 资源空转,无疑是巨大的浪费。又比如在多进程同步场景下,进程可能需要等待共享资源的解锁,盲目等待只会拖慢整个系统的运行效率。而进程的睡眠与唤醒机制,是 Linux 内核实现高效 CPU 资源调度的核心。它能让进程在等待资源时主动进入睡眠状态,让出 CPU 给其他更需要的进程,等资源就绪后再被唤醒继续执行。

2026-03-30 16:44:41 346

原创 一文吃透 Linux 文件描述符:揭开「一切皆文件」的底层逻辑

在 Linux 系统中,文件描述符(File Descriptor)是一个非负整数,它是进程访问文件或其他 I/O 资源(如套接字、管道等)的唯一标识。简单来说,文件描述符就像是一个 “资源索引”,它指向内核中被打开的文件或资源,是进程与内核之间进行文件操作的桥梁。需要注意的是,文件描述符本身并不是文件,而是一个指向文件或资源的标识符。每个进程都维护着一个独立的文件描述符表(File Descriptor Table),这个表记录了该进程当前打开的所有文件描述符及其对应的内核文件对象。

2026-03-26 14:57:01 370

原创 腾讯 C++ 二面真题:std::make_shared 与构造函数传指针的核心区别

回顾一下,make_shared和构造函数传裸指针创建shared_ptr对象主要有以下几方面区别。内存分配上,make_shared一次分配搞定对象和控制块的连续内存,构造函数传裸指针则需两次分配,效率和缓存友好性上make_shared更优。异常安全方面,make_shared把对象创建、控制块分配和构造放一个函数,原子操作保障异常安全;构造函数传指针若创建对象后控制块构造抛异常,会内存泄漏。内存释放时机,make_shared因对象和控制块同块内存,要等强弱引用计数都为 0 才释放;

2026-03-23 16:57:03 358

原创 C++ RAII 到底是什么?

自定义资源管理类时,遵循一定的规则是确保代码正确性和可靠性的关键。其中,“五法则” 和 “零法则” 是两个重要的指导原则。

2026-03-20 17:43:34 413

原创 新手也能看懂的 Linux 共享内存

共享内存,简单来说,是 Linux 中一种能够让多个进程直接访问同一块物理内存空间的技术。在传统的进程通信方式中,比如管道(Pipe)和消息队列(Message Queue),数据在传递时需要进行多次拷贝,先从一个进程的用户空间拷贝到内核空间,再从内核空间拷贝到另一个进程的用户空间。这就好比你要把一份文件从一个房间送到另一个房间,每次都要经过一个中转站,先把文件放在中转站,然后再从中转站取走送到目标房间,效率相对较低。

2026-03-17 14:43:16 385

原创 C++ 多线程:数据竞争

为了进一步简化锁的操作,提高代码的可读性和可维护性,可以封装通用的监控类,将锁的管理逻辑封装在类中,就像为锁穿上了一层智能的 “外衣”,只需要关注业务逻辑,而无需担心锁的细节。public:在这个Monitor类中,使用了std::mutex来保护共享数据data,并通过重载operator()运算符,提供了一种简洁的方式来执行对data的操作。

2026-03-16 15:54:51 369

原创 底层逻辑:C++ 类型萃取(Type Traits)解析

类型萃取,从本质上来说,是一种强大的 C++ 模板元编程技术。它允许我们在编译期获取并利用类型的各种信息,比如判断一个类型是否为整数类型、是否为指针类型、是否为常量类型等。通过这些信息,我们可以编写更加通用、高效且类型安全的代码。简单来讲,类型萃取就像是一个智能的 “类型探测器”,它能在代码编译阶段就对各种类型进行 “探测” 和 “分析”,并根据探测结果做出不同的决策。在 C++ 的世界里,类型萃取是泛型编程的重要支撑。泛型编程的目标是编写与类型无关的代码,以提高代码的复用性。

2026-03-12 14:21:57 400

原创 C/C++为何依赖头文件,而 Java/Python 无需?

/ math.h - 头文件(接口声明)// math.c - 源文件(功能定义)在C/C++开发体系中,编译器需预先获知函数、类、变量的存在性及接口规范,方可完成代码的语法校验与编译。头文件的核心作用便是提供此类接口信息,相当于编译器可参考的“接口说明书”。

2026-03-11 14:53:38 420

原创 C++ 析构函数到底怎么用?原理、场景、实战一篇讲透

析构函数是一种特殊的成员函数,它就像是一个默默守护的 “清洁工” ,专门负责在对象的生命周期结束时,进行必要的清理工作。与普通函数不同,析构函数的名字很有特点,是在类名前面加上一个波浪号 “\”。比如,对于一个名为 “Student” 的类,它的析构函数就是 “\Student ()”。析构函数没有返回类型,这一点和构造函数一样,而且它也没有参数,所以不能被重载,一个类只能有一个析构函数。当对象即将被销毁时,析构函数就会自动被调用,就像下课铃响了,值日生会自动开始打扫教室一样。

2026-03-10 15:26:12 375

原创 快手 C++ 面试题:如何突破封装访问私有成员?

关于如何拿到类中私有成员变量的值,就跟大家分享到这里。我们重点需要关注回答思路:我们重点需要关注的就是这个回答思路:正确的方式是什么?其他的方案有哪一些缺陷?它的合理使用场景是什么?通过这种回答呢就能够比较严谨的体现我们对它的一个理解。往期精选干货| C/C++开发从迷茫到进阶,一站式成长指南覆盖选方向、找工作、冲大厂、定路线、备面试、练实操全场景,帮你精准避坑,高效进阶:👉【就业避坑】C++ 就业前景全解析:为什么劝退声不断,大厂核心岗仍刚需 C++?👉【后端进阶】

2026-03-09 15:56:39 397

原创 搞懂这道题,再也不怕面试官问 move/forward 和完美转发

掌握std::move和std::forward的关键,不在于死记底层代码,而在于理解它们的“语义本质”:std::move:“我不管这是什么,把它变成可以移动的右值,我要转移它的资源”;std::forward:“我不改变它的本质,原封不动地把它传递给下一个函数”。

2026-03-07 15:00:55 392

原创 MySQL连接池(C++实现):原理、调优

做过高并发的同学都懂,数据库往往是压测时第一个扛不住的环节 —— 尤其是 MySQL连接的创建销毁,简直是性能杀手。而MySQL连接池,正是解决这一问题的 “智能系统”。它提前创建一定数量的数据库连接并维护起来,当应用程序需要访问数据库时,直接从连接池中获取可用连接,使用完成后再将连接归还到池中,避免了频繁创建和销毁连接的开销。但很多人对连接池的原理不了解,在实际使用中要么配置不当导致性能浪费,要么遇到连接失效、池满阻塞等问题。

2026-03-06 16:23:54 460

原创 C/C++ 后端项目:从零实现死锁检测

/ 线程 ID// 锁的地址(作为唯一标识)// 该锁被多少个其他线程等待(入度计数)} node;node n;// 当前顶点对应的线程与锁信息// 邻接表指针,指向依赖的下一个线程} vertex;// 图的邻接表:每个线程指向其依赖的线程int num;// 当前图中线程节点数量// 记录每把锁当前被哪个线程持有// 已记录的锁数量死锁检测的核心在于将资源竞争关系建模为有向图,并检测其中是否存在环路。图的动态构建。

2026-03-05 17:47:50 459

原创 面试官最爱问:进程和线程到底有啥区别?

CPU 寄存器值累加器(存计算结果)、程序计数器(PC,存下条指令地址)、栈指针(存栈顶位置)等记录车间设备参数(如机床转速、卡尺当前读数)进程状态由 PCB 管理,含 “就绪 / 运行 / 阻塞” 等状态(如进程因等待网络请求进入 “阻塞” 态)记录车间生产进度(如 “待料中”“加工中”“已完工”)地址空间信息页表 / 段表(映射虚拟内存到物理内存)、内存权限(如代码区只读、数据区可读写)记录车间布局(如 “物料区在东、设备区在西”)+ 区域规则(如 “物料区禁止吸烟”)

2026-03-04 17:43:29 394

原创 CPU 如何切换任务?从内核视角理解两种上下文

作为 C++ 开发者,你一定写过多线程程序吧?比如用 Qt 的 QThread 做界面渲染,或者用 pthread 搞音视频解码,跑起来感觉 "多任务并行" 丝滑无比。但你有没有突然好奇:就那几颗 CPU 核心,怎么能同时扛住浏览器、编译器、音乐播放器一堆程序?难道 CPU 真的会分身术?其实真相很扎心 ——CPU 根本不会同时干多件事!它所谓的 "多任务",本质就是高速切换任务的 "障眼法",而这背后的核心操作,就是咱们今天要扒的「CPU 上下文切换」。

2026-03-03 20:28:25 425

原创 科大讯飞 C++ 一面真题:构造函数为何不能是虚函数?调用虚函数有何风险?

构造函数不能是虚函数:因为 vptr 还没准备好(机制冲突),而且构造是 “接生”,虚函数是 “干活”(语义矛盾),C++ 标准直接禁止;构造函数中调用虚函数,多态会失效:只会执行当前构造类的版本,还可能访问未初始化成员,尽量别这么做;析构函数要当虚函数(如果是基类):不然多态场景下会内存泄漏,纯虚析构要记得写实现。其实 C++ 的很多 “奇怪规矩”,背后都是 “避免未定义行为”—— 理解了底层逻辑,你就不会觉得 “C++ 故意刁难人”,反而会觉得 “这些规矩真香”。附录常见问题 FAQ。

2026-03-02 21:12:50 957

原创 一文读懂:基于 UDP 的 QUIC 可靠传输协议核心原理

QUIC 不是没有缺点:比如稳定性不如 TCP(毕竟 TCP 已经用了几十年),某些老设备不支持,还有 UDP 限速的问题。但就像 “智能手机刚出来时,有人嫌它续航差,但没人能阻止它取代功能机”——QUIC 解决的是 TCP 几十年没解决的痛点,是网络发展的必然趋势。IETF标准化持续推进主流浏览器均已支持Nginx 1.25.0正式支持QUIC各大云厂商积极推广是时候拥抱QUIC了!无论是为了提升用户体验,还是为了技术储备,QUIC都值得你深入了解和实践。

2026-02-28 17:10:02 1022

原创 C++ 面试必考点:string 类

在C++编程中,string类是处理字符串的核心工具,它提供了丰富的方法来简化字符串操作。相比于C风格的字符数组,string类更加安全、便捷且功能强大,还能避免C风格字符串处理中常见的内存管理问题和边界错误。

2026-02-27 17:39:20 1042

原创 Linux 高性能异步 IO:io_uring

系统调用开销过高:无论是同步 IO 还是传统异步 IO,每次 IO 请求都需要通过系统调用陷入内核态。对于高并发场景,百万级的系统调用会带来巨大的上下文切换开销,成为性能瓶颈。数据拷贝冗余:用户态与内核态之间的数据传输需要经过多次拷贝(如用户缓冲区→内核缓冲区→设备缓冲区),内存拷贝的耗时在高吞吐量场景下不可忽视。扩展性与易用性失衡:POSIX AIO 为了兼容多平台,牺牲了性能;Linux AIO 性能尚可,但仅支持 Direct IO,且接口设计复杂,难以集成到复杂应用中。减少系统调用。

2026-02-26 16:20:16 1068

原创 C++高并发精髓:无锁队列深度解析

在高性能场景中,并发数据传输的效率直接决定系统吞吐量。传统锁队列(如std::queue+std::mutex)在20线程以上高并发下,CPU时间大量消耗于内核态锁竞争(futex系统调用),线程多数时间处于等待状态,吞吐量停滞不前,甚至可能导致死锁、优先级反转等问题。而无锁编程(Lock-Free Programming)作为一种非阻塞同步范式,旨在通过原子操作和内存序控制,实现线程间的高效数据交换,从而避免上述问题。

2026-02-08 14:21:06 829

原创 C++11 进阶:线程池手动实现,看完直接上手

线程池这东西说白了就是管理任务和线程的配对,掌握核心原理,剩下的都是语法糖这套线程池虽然只有百来行,但五脏俱全!支持任意函数、任意参数、返回值获取、线程安全、资源自动回收……简直是C++并发入门的“黄金样板”!不过老铁们注意啊:实际项目中还得考虑异常安全、任务拒绝策略、动态扩缩容啥的。但作为基础框架,它已经把核心思想给你焊死了——复用线程 + 安全队列 + 条件唤醒,三大心法,缺一不可!

2026-01-30 15:13:33 962

原创 秋招实录|小米嵌入式软件工程师一面面经

实际应用:在IMU数据处理中,我们用reserve(2000)预分配缓冲区,避免在实时线程中触发内存分配(导致延迟抖动)。在小米项目中,将IMU数据更新锁粒度从全局锁缩小到单个传感器,线程吞吐量提升2.3倍。实例:在预录制功能开发中,我将任务拆为3个独立模块,优先完成数据流处理(核心),用Pomodoro法每天专注4小时,提前2天交付。小米项目经验:在设备驱动设计中,所有基类都使用虚析构,避免内存泄漏。如果你想入局音视频流媒体赛道,想掌握该领域的核心学习路径,搭建完整的技术体系,一定要看。

2026-01-29 14:32:45 762

原创 【无标题】

按 “背景 - 任务 - 行动 - 结果” 梳理,例如 “在 XX 公司负责车载系统数据模块开发,使用 C++ 实现数据解析逻辑,优化了 XX 接口的响应速度(如从 50ms 降至 20ms),解决了 XX 数据丢包问题(通过增加校验机制)”,需突出个人主导的技术动作与可量化成果。例如 “参与车载通信模块开发时,面临多线程数据竞争问题,通过引入 std::mutex 与条件变量实现线程同步,同时使用 shared_ptr 管理内存,避免内存泄漏,最终保障模块稳定运行 3000 + 小时无异常”。

2026-01-21 22:10:50 690

原创 别再盲目刷题!C++ 后端面试这样准备,大厂 HR 更认可

为什么要专门分享 C++后端 面试题?后端同学准备面试时,Java 岗位的题库一搜一大把,C++ 后端的面试内容却又散又乱,很难系统整合。所以我整理了一份一线互联网大厂的高频 C++ 后端面试题,直接帮大家省时间。这份面试题专为 C++ 后端岗位整理,覆盖 8 大核心领域,共计 200 道题,方便你针对性复习。

2026-01-20 14:38:08 648

原创 C/C++内存布局实战:如何利用内核映射与编译器优化提升性能

性能优先选栈,灵活优先选堆 :栈的访问速度是堆的 10~100 倍,小块高频分配用栈(如局部数组、小对象),大块低频分配用堆(如大数组、动态对象);全局变量慎用,static 局部更安全 :全局变量有初始化顺序问题,static 局部变量可控制初始化时机,且 C++11 后线程安全;堆碎片靠管理,内存池是良药 :频繁分配释放小块内存时,用内存池(如 boost::pool )替代 malloc ,减少碎片;

2026-01-13 17:18:58 728

原创 C++ STL 算法:从原理到工程实践

STL 算法的本质是 “泛型编程思想的落地”—— 通过迭代器解耦算法与容器,通过函数对象扩展算法逻辑,最终实现 “一次编写,多容器复用” 的高效开发模式。掌握 STL 算法,不仅是学会调用 API,更是理解 “如何设计通用、高效、安全的代码”。

2025-12-20 17:44:04 1092

原创 计算机专业:C++ 与 Java 的选择与发展路径

不少计算机专业学生都会陷入一个纠结:C++ 和 Java 到底选哪个?怕一步选错,影响后续就业和职业发展。今天就从个人规划、就业竞争、高薪要素、核心能力四个维度,和大家好好聊聊这个问题,帮你理清思路。

2025-12-04 15:40:46 1222

原创 C++ 后端必备项目:实现高性能 HTTP 服务

在高并发 API 网关、低延迟静态资源服务、企业级微服务接口这些场景里,C++ 总能凭借其 “零开销抽象” 的特性占据一席之地。用 C++ 写 HTTP 服务,绝不是简单封装 Socket 那么简单 —— 从 TCP 握手的细节到 HTTP/3 的 QUIC 协议,从内存池的字节管理到 K8s 的容器编排,这是一条贯穿 “协议原理→架构设计→工程落地” 的全栈之路。今天咱们就把 C++ HTTP 服务的核心技术掰开揉碎讲清楚。

2025-11-27 21:49:26 993

原创 C++ 底层原理解析:已有指针,为何仍需引用?

指针的核心价值是灵活可控,适合需要底层操作、动态改向的场景;引用的核心价值是安全简洁,适合需要明确语义、避免拷贝的场景。两者的共存,体现了 C++"多范式适配" 的设计智慧 —— 用合适的工具解决合适的问题。现代 C++ 开发越来越强调 "安全优先",引用的地位也愈发重要。我们应告别 "指针万能论",养成 "优先用引用,必要用指针" 的习惯。// 智能指针+引用:安全访问动态内存// 引用访问,避免指针解引用冗余。

2025-11-26 20:15:09 760

原创 京东一面真题:C++ 拷贝构造函数何时生成、如何用?

在 C++ 面试中,“默认拷贝构造函数的生成时机” 是高频题,这个问题在面试中经常被问到,也是日常编码中需要特别注意的地方。看似简单但容易踩坑。今天咱们从基础概念到面试题逐步拆解,帮你把考点吃透。拷贝构造函数是 C++ 中用于 “用已存在的对象初始化同类型新对象” 的特殊构造函数,它是对象复制与初始化的核心机制,形参必须是本类对象的 const 引用(若用值传递会触发递归调用,编译报错),基本语法格式为:类名(const 类名& 源对象名);1.1、显式定义示例以Student类为例,显式实现拷贝构造函数,

2025-11-08 15:35:45 1029

原创 面试加分项:C++ 运算符重载的核心语法

运算符类型必须为成员函数优先为非成员函数说明是否赋值运算符必须是成员函数[]是否下标运算符必须是成员函数()是否函数调用运算符必须是成员函数->是否成员访问运算符必须是成员函数+=, -=是通常复合赋值运算符可以是成员或非成员+, -, ==,!=, <<, >>否是对称运算符优先使用非成员函数否是混合类型运算符必须使用非成员函数关键决策点何时必须为成员函数:=, [], (), ->

2025-11-07 15:43:12 1189

原创 B 站 C++ 一面题分享:互斥锁和自旋锁有啥区别?各自该用在啥场景?

临界区是指需要原子性访问的代码段,通常被lock(加锁)和unlock(解锁)操作包裹。// 线程A的操作// 线程B的操作上述shared_counter++和shared_counter--即为临界区。若没有同步机制,两个线程可能同时修改shared_counter,导致数据不一致(如丢失更新)。核心本质:互斥锁与自旋锁的差异源于 “等待策略”—— 阻塞 vs 自旋,进而决定开销与适用场景;选择原则:临界区短(<1ms)用自旋锁(或原子操作),临界区长(>1ms)用互斥锁;

2025-11-03 15:36:51 1080

原创 传统网络不够快?RDMA 了解下!浅聊它的架构与性能

RDMA 技术的核心价值,在于通过 “内核旁路”“零数据复制” 和 “硬件卸载” 三大技术,彻底解决了传统 TCP/IP 通信中的性能瓶颈。它将数据传输的控制权从操作系统交还给硬件和应用程序,大幅降低了延迟、减少了 CPU 开销,同时提升了带宽利用率。如今,随着 AI、大数据、分布式存储等领域对高性能网络的需求日益迫切,RDMA 已从最初的超算场景,逐步普及到企业级数据中心和云服务中,成为构建高性能 IT 基础设施的关键技术之一。

2025-10-30 15:16:35 1250

原创 聊聊C++ std::function :类型擦除原理和高性能实践

std::function 是 C++11 引入的通用多态函数封装器,其本质是一个类模板,模板参数为函数签名(返回值类型 + 参数类型列表)。脱离具体可调用实体的类型,仅通过函数签名提供统一的调用接口。// 函数签名:void(int)(接受int参数,返回void)std::function 作为现代 C++ 可调用实体的 “统一接口”,其核心价值在于平衡了灵活性与易用性:它屏蔽了不同可调用实体的类型差异,却未牺牲太多性能;它支持几乎所有 C++ 可调用实体,却提供了简洁的调用方式。

2025-10-29 15:28:45 1207

原创 顺时针螺旋移动法详解:C/C++ 复杂嵌套声明与 const 常量声明怎么学?

顺时针螺旋法的核心不是记住步骤,而是建立 "以实体为中心,顺时针解析修饰符" 的思维模式。能在 30 秒内解析任意复杂度的声明能根据自然语言描述写出正确的声明能识别并重构代码中 "反人类" 的复杂声明训练计划第 1 天:解析 10 个指针与数组的基础声明第 2 天:练习 5 个函数指针的解析与编写第 3 天:挑战 3 个函数指针数组的嵌套声明第 4 天:专项训练 const 与指针的组合(10 个案例)第 5 天:用 typedef/using 简化 3 个复杂声明。

2025-10-21 21:15:47 680

空空如也

空空如也

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

TA关注的人

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