- 博客(76)
- 收藏
- 关注
原创 深入学习Linux进程间通信:解析消息队列
本文深入探讨Linux消息队列的核心原理与应用,重点分析SystemV实现方式。文章详细讲解SystemV消息队列的API使用、消息类型妙用、阻塞规则等核心知识点,提供完整代码示例,并指出常见陷阱如消息残留、结构体对齐等问题。
2026-05-04 23:47:41
529
原创 深入学习Linux进程间通信:共享内存
共享内存技术是进程间通信(IPC)中性能最高的方式,它通过内核开辟物理内存区域并让多个进程的页表映射到同一内存区域,实现零拷贝数据共享。本文系统介绍了共享内存的核心概念、实现方式及同步机制
2026-05-04 23:28:34
363
原创 Linux信号(Signal)
本文介绍了Linux信号机制的核心概念和使用方法。主要内容包括:信号的定义(软件中断)、生命周期(产生-注册-递送-处理)、必须掌握的常用信号(如SIGINT、SIGTERM等)、三种处理方式(忽略/默认/自定义)。重点讲解了信号API(signal/kill/alarm/sigaction)、信号集与阻塞机制、可重入函数的安全使用原则(避免在信号处理函数中使用printf等不安全函数)。文章还提供了优雅退出、超时控制、子进程回收等常见编程模式,以及调试命令和常见错误排查方法。
2026-05-03 20:45:43
1199
1
原创 Linux管道(Pipe)深度指南:从原理到实战
本文深入解析Linux管道通信的核心技术,对比匿名管道与命名管道的特性差异。详细讲解匿名管道的fork实现和命名管道的mkfifo用法,重点剖析管道阻塞行为和PIPE_BUF原子性问题。文章包含多进程通信的典型代码示例,指出常见陷阱如死锁、数据截断等,并提供strace等调试工具的使用方法。最后介绍双向通信方案和全双工socketpair的进阶用法,帮助开发者深入理解Linux进程间通信机制,规避实际开发中的常见问题。
2026-05-03 20:01:11
545
原创 中断 · 软硬中断 · 时钟中断 · 缺页中断——从CPU引脚到操作系统调度
本文深入解析Linux系统中的中断机制,从硬件到内核的全路径视角,重点对比了硬件中断、软件中断、时钟中断和缺页中断四大类型及其对程序性能的影响。
2026-05-01 17:48:26
706
原创 C++11新特性
C++11通过智能指针(unique_ptr/shared_ptr)实现了自动化内存管理,引入移动语义(右值引用/std::move)显著提升性能,支持Lambda表达式和auto类型推导提升代码简洁性。异常处理机制通过栈展开确保资源安全释放,完美转发(std::forward)解决了泛型编程中的参数传递问题。其他重要特性包括统一初始化、nullptr、override/final和constexpr等,使C++成为更安全高效的现代编程语言。这些改进使C++在保持高性能的同时,显著提升了开发效率和代码可靠性
2026-04-29 00:34:57
430
原创 红黑树详解
红黑树是一种自平衡二叉搜索树,通过颜色约束保持近似平衡。文章详细解析了红黑树的五大性质、节点结构设计(新节点默认为红色)和插入操作的核心逻辑。
2026-03-26 23:58:50
620
原创 C++AVL树详解,含四种旋转
AVL树是一种自平衡二叉搜索树,通过平衡因子(左子树高度-右子树高度)确保任意节点左右子树高度差绝对值≤1。核心操作包括四种旋转:右旋(处理左左型失衡)、左旋(右右型)、左-右旋(左右型)和右-左旋(右左型)。
2026-03-12 17:19:56
528
原创 C++ Lambda 表达式详解
本文介绍了C++11引入的Lambda表达式特性。重点讲解了捕获子句的用法,包括按值捕获([=])、按引用捕获([&])及混合捕获方式。强调Lambda能大幅简化代码,特别适合与STL算法配合使用,是C++11的重要特性之一。
2026-03-12 16:35:29
499
原创 C++ 智能指针详解
C++智能指针是自动管理动态内存的RAII工具,主要包括unique_ptr、shared_ptr和weak_ptr三种类型。智能指针能有效防止内存泄漏,提升代码安全性和可维护性。
2026-03-06 23:13:17
659
原创 右值引用和移动语义详解
C++11引入的右值引用和移动语义解决了临时对象拷贝效率低下的问题。这些特性特别适用于容器操作、大型对象返回等场景,能显著提升程序运行效率。使用时需注意移动后对象状态管理及异常安全问题。
2026-03-06 19:07:12
477
原创 push_back和emplace_back的区别与选择
摘要:C++ STL中的push_back和emplace_back方法在添加元素时存在本质区别。push_back需要先构造完整对象再拷贝/移动到容器中,而emplace_back直接在容器内存中构造对象,避免了临时对象的创建和移动操作。
2026-02-07 16:09:42
1153
原创 Set 和 Map 深入详解及其区别
C++ STL中的关联式容器(map/set)基于红黑树实现,存储有序元素。map存储键值对,支持快速查找和修改;set存储唯一值,用于去重和集合运算。两者都提供O(logn)的插入、删除和查找操作,支持自定义比较函数。multimap和multiset允许键重复。主要区别在于map维护键值映射关系,set仅维护值集合。这些容器在需要有序存储和快速查找的场景中非常高效。
2025-12-20 16:59:10
810
原创 二叉树最近公共祖先(LCA)问题详解
本文介绍了二叉树中寻找两个节点最近公共祖先(LCA)的两种方法。递归方法通过深度优先搜索,判断节点在左右子树中的分布情况来定位LCA,时间复杂度为O(n)。非递归方法使用父指针映射,将问题转化为链表相交问题,通过建立父节点关系表和回溯路径来查找LCA。两种方法各有特点,递归简洁但可能栈溢出,非递归更稳定但需要额外空间存储父节点信息。
2025-12-10 00:46:36
1090
原创 【数据结构】二叉搜索树
本文介绍了二叉搜索树的基本操作,包括查找、插入和删除节点的方法。文章还给出了C++实现代码,包含节点类模板和二叉搜索树类模板,演示了插入、查找、删除和中序遍历等核心功能。
2025-12-05 00:02:31
534
原创 【C++】多态与虚函数
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2025-12-03 19:24:17
1016
原创 C++继承详解
摘要:继承是面向对象编程中实现代码复用的重要机制,允许派生类在基类基础上扩展功能。文章详细介绍了三种继承方式(公有、保护、私有)的特点及访问权限变化,阐述了基类与派生类间的对象赋值转换规则。同时分析了继承体系中的作用域规则、派生类成员函数特性,以及友元关系的不可继承性。针对复杂的菱形继承问题,提出了虚继承解决方案。最后对比了函数重载、隐藏和覆盖三者的区别,重点说明了虚函数实现多态性的原理。全文系统性地讲解了继承机制的核心概念及其应用场景。
2025-12-02 18:37:35
906
原创 【C++STL】List详解
list是C++的一个序列容器,允许在序列中的任意位置进行常数时间的插入和删除操作,并支持双向迭代。列表容器采用双向链表实现,与其他基本标准序列容器(数组、向量和双端队列)相比,列表在插入、提取和移动容器内已获得迭代器的任何位置的元素方面通常表现更好,主要缺点是它们无法通过位置直接访问元素
2025-11-25 02:40:30
1140
原创 【C++STL】vector详解
本文介绍了C++ STL中的vector容器,包括其基本概念、内存模型及常用接口。vector作为动态数组,支持快速随机访问和自动扩容,但中间插入/删除操作效率较低。详细讲解了vector的初始化、遍历(operator[]、at()、迭代器)、空间管理(resize/reserve)以及增删查改操作(push_back/pop_back/find/insert/erase/swap)。特别强调了迭代器失效规则和不同编译器的扩容策略差异。vector适合需要频繁随机访问和尾部操作的场景。
2025-11-20 08:00:00
1214
原创 C++模板初阶
摘要:C++泛型编程通过模板实现代码复用,包括函数模板和类模板。函数模板允许编写与类型无关的通用函数,编译器根据调用时的实参类型自动实例化具体版本。函数模板支持隐式和显式实例化,遵循精确匹配优先的规则。类模板则用于创建通用数据结构,实例化时需要显式指定类型参数。泛型编程减少了代码重复,提高了可维护性,是C++重要编程范式。
2025-10-15 15:52:59
1207
原创 C/C++内存管理(new,delete)
本文深入探讨了C/C++内存管理与动态分配机制。主要内容包括:1) C/C++程序内存划分为代码区、全局/静态区、栈区、堆区和常量区;2) C语言通过malloc/calloc/realloc/free管理动态内存;3) C++引入new/delete运算符,对内置类型只管理内存,对自定义类型还处理构造/析构函数;4) 底层通过operator new/delete函数实现,分别封装malloc/free;5) 定位new表达式可在指定内存位置构造对象;6) 比较了malloc/free与new/delet
2025-10-14 20:58:26
874
原创 类与对象(下)
本文摘要: 本文深入探讨了C++中的构造函数初始化列表、隐式类型转换、static成员、友元和匿名对象等核心概念。重点内容包括:1) 初始化列表的使用场景和重要性,特别是const成员、引用成员和继承情况下的必要性;2) 隐式类型转换的机制及优缺点,强调推荐使用explicit避免潜在问题;3) static成员的特性及其定义方式;4) 友元机制的工作原理及其对封装性的影响;5) 匿名对象的定义、生命周期和应用场景。文章通过大量代码示例详细解析了这些特性的正确使用方式及其潜在风险,为深入理解C++面向对象编
2025-10-10 17:35:40
858
原创 类与对象(中)
这篇文章介绍了C++类的6个默认成员函数及其特性。主要内容包括:1)构造函数用于对象初始化,支持重载;2)析构函数负责资源清理,在对象生命周期结束时自动调用;3)拷贝构造函数创建对象副本,默认实现浅拷贝;4)运算符重载允许自定义类型运算符行为;5)const成员函数修饰this指针,限制成员修改;6)取地址运算符重载通常不需要自定义实现。文章重点说明了何时需要自定义这些成员函数,特别是当类管理动态资源时需要自定义析构函数和拷贝构造函数。
2025-10-09 18:28:28
1116
原创 C++运算符重载
本文介绍了C++运算符重载的基本概念和实现方法。运算符重载允许为自定义类型定义运算符行为,增强代码可读性。文章详细讲解了可重载的运算符类型、基本语法规范,以及不可重载的运算符。通过日期类Date的示例,展示了赋值运算符、比较运算符、算术运算符、自增运算符和流操作符等常见运算符的重载实现技巧,包括参数处理、返回值优化和特殊情况处理等关键点。最后强调了运算符重载的注意事项和最佳实践。
2025-10-09 18:19:15
1160
原创 类与对象(上)
本文系统介绍了C++面向对象编程的核心概念。主要内容包括:1)面向过程与面向对象的区别;2)类的引入与两种定义方式;3)访问限定符(public/private/protected)及其封装特性;4)类的实例化过程;5)类对象大小的计算规则;6)成员函数的this指针及其应用场景。重点阐述了C++通过类将数据与操作封装在一起,利用访问控制实现信息隐藏的特性,以及this指针在成员函数中的重要作用。这些概念构成了C++面向对象编程的基础框架。
2025-09-29 18:25:44
1307
原创 C++引用
在 C++ 中,引用(Reference)是一种为变量或对象起别名的方式,它提供了对现有数据的间接访问。引用是 C++ 区别于 C 语言的重要特性之一,设计初衷是提高代码的安全性和可读性,同时避免指针的复杂性。在生活中,我们可能也会给一些同学起外号,以“张三”同学为例,我们可以叫他“啊三”,当我们叫到这个外号的时候就会自然而然的想到“张三”同学,”啊三”就是张三的别名。在语法层面上看,引用就是取别名引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量。
2025-02-25 20:10:20
512
1
原创 C++函数重载,C不支持函数重载的原因
C++ 中的函数重载(Function Overloading)允许在同一作用域内定义多个同名函数,但这些函数的参数列表必须不同(参数的类型、数量或顺序不同)。函数重载的目的是让函数名更具语义化,同时处理不同类型或数量的参数。
2025-02-25 19:38:53
852
原创 C++缺省参数
在C++中,缺省参数(Default Arguments)允许在函数声明时为参数指定默认值。当调用函数时,若未显式提供该参数的值,则自动使用默认值。缺省参数可以简化函数调用,并为函数提供更灵活的用法。
2025-02-24 20:02:30
524
原创 C++命名空间域
在C++中,命名空间(Namespace)是一种用于组织代码、避免命名冲突的机制,而“命名空间域”可以理解为命名空间的作用域,即在命名空间内定义的标识符(如变量、函数、类等)的可见性和访问范围。
2025-02-24 19:29:22
797
原创 【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)
元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法4.稳定性:稳定希尔排序是对直接插入排序的优化当gap>1时都是预排序,目的是让数组更接近有序。当gap==1时,数组已经接近有序,这样排序就会很快。这样整体而言,可以达到优化的效果希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在不同书上给出的希尔排序的时间复杂度都不一样冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)
2024-05-21 16:55:25
1254
1
原创 【数据结构】快速排序(详解)
在待排序的序列中,选择一个元素作为基准元素(key)。这个元素可以是序列的第一个元素、最后一个元素或者任意一个元素,甚至是随机选取的一个元素。:从序列的一端开始(可以是左端或右端),将遇到的第一个比基准元素小(或大)的元素填入坑中,并形成一个新的坑。在非递归版本中,我们使用栈(或队列)来保存待排序的子数组的起始和结束索引,而不是直接递归调用;:一个记录序列的开始的下标(left),另一个记录序列的末尾的下标(right)。:此时,基准值左边的所有元素都比基准值小,基准值右边的所有元素都比基准值大。
2024-05-21 16:53:45
1483
原创 【数据结构】单链表逆置(详解)————四种方法
逆置就是把最后一个数据提到最前面,倒数第二个放到第二个……依次类推,直到第一个到最后一个。由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的链表来实现逆置。
2024-05-17 18:38:39
2409
2
原创 树的概念与结构(详解)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分为M(M>0)个互不相交的集合T1,T2,......,Tm,其中每个集合Ti(1<=i<=m)又是一颗结构与树类似的子树。每颗子树的根节点有且只有一个前驱结点,可以由0个或多个后继结点因此,树是递归定义的注意:树形结构中,子树之间不能有交集,否则就不是树形结构。
2024-05-17 13:43:07
1395
原创 二叉树OJ题解2(相同二叉树,对称二叉树)
若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。如果一个树的左子树与右子树镜像对称,那么这个树是对称的。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如果两个二叉树都不为空:(那么首先判断它们的根节点的值是否相同)如果两个二叉树中有且只有一个为空:则两个二叉树一定不相同。每个树的右子树都与另一个树的左子树镜像对称。如果两个二叉树都为空:则两个二叉树相同。
2024-05-04 13:41:28
402
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅