- 博客(125)
- 收藏
- 关注
原创 C++11
C++11是C++语言的重大更新,引入了140多项新特性。主要内容包括: 列表初始化:支持使用{}对所有内置类型和自定义类型进行初始化,支持多参数隐式类型转换 std::initializer_list:容器新增以initializer_list为参数的构造函数,方便初始化 auto关键字:用于自动类型推导,简化变量声明,可用于范围for循环和函数返回值 其他声明关键字:如decltype等,简化复杂类型的声明 这些特性使C++语法更简洁,开发效率更高,在实际项目中应用广泛。C++11在系统开发和库开发方面
2026-03-02 09:00:00
363
原创 Linux线程
本文介绍了Linux线程的基本概念与实现原理。Linux通过轻量级进程(LWP)实现线程,内核使用task_struct描述线程,线程共享进程地址空间等资源但拥有独立的线程栈和上下文。pthread库封装了线程操作接口,线程ID本质是线程控制块在共享区的地址。线程相比进程具有创建开销小、切换效率高等优点,但也存在健壮性降低等缺点。文章还详细讲解了线程创建、线程ID获取以及线程局部存储等关键概念,通过代码示例展示了线程的实际应用。
2026-03-02 08:37:43
396
原创 Linux进程间通信
进程间通信(IPC)是解决进程独立性导致无法直接共享数据的关键技术。其本质是通过操作系统提供的内存空间实现数据交换,避免破坏进程独立性。主要分为三类:管道(匿名/命名)、System V IPC(消息队列、共享内存、信号量)和POSIX IPC(消息队列、共享内存、信号量)。匿名管道通过pipe系统调用创建,利用文件描述符实现单向通信,适用于父子进程间通信。示例代码展示了父子进程通过管道传递数据的实现过程,并指出管道具有单向性和自带同步机制的特点。这种机制确保了进程间安全高效的数据共享与协作。
2026-03-02 08:35:23
423
原创 Linux进程池
进程池是一种预先创建并维护多个子进程的机制,通过复用进程减少频繁创建销毁的开销。父进程通过管道与子进程通信,派发任务并收集结果。实现中定义了Channel结构管理子进程和管道,ProcessPool类负责创建、控制和回收子进程。子进程通过重定向标准输入监听任务,执行预设函数(如打印日志、重载配置等)。该方法提高了系统效率,便于管理并发任务,并通过关闭冗余文件描述符确保通信可靠性。
2026-03-02 08:34:12
509
原创 Linux 信号
Linux信号机制是进程间异步通信的重要方式,通过kill命令、系统调用、键盘组合键或异常触发信号。进程收到信号后可选择忽略、默认处理或自定义处理。信号保存通过block和pending两个位图实现,前者标记被阻塞信号,后者记录待处理信号。用户可通过sigset_t类型和sigprocmask等函数操作信号集,实现对特定信号的阻塞管理。
2026-03-02 08:33:16
443
原创 Linux 命令行参数&环境变量
本文介绍了命令行参数和环境变量的概念与应用。命令行参数是通过main函数的argc和argv传递的字符串数组,用于实现程序的不同功能调用,是Linux指令选项的基础。环境变量是系统内置变量,包含PATH、HOME、PWD等关键配置信息,用于定义系统运行环境。PATH存储可执行文件路径,HOME记录用户主目录,PWD保存当前路径。通过export可临时修改环境变量,永久修改需编辑.bash_profile文件。环境变量作为内存级变量,在系统重启后会重新初始化。
2026-03-02 08:32:14
340
原创 Linux 基础I/O
本文介绍了文件操作的基础知识和接口。文件由内容和属性组成,打开文件是将磁盘文件加载到内存的过程。C语言提供了fopen、fwrite、fread等文件操作接口,其中打开方式w和a分别对应输出重定向和追加重定向功能。此外,进程启动时会记录当前工作目录cwd,用于确定文件创建路径。通过实验演示了不同打开方式对文件操作的影响,解释了重定向的实现原理。
2026-03-02 08:31:34
380
原创 Linux 软硬连接&动静态库
本文介绍了Linux系统中的软硬链接和动静态库相关知识。在软硬链接部分,详细说明了软链接(ln -s)和硬链接(ln)的创建方法及本质区别:软链接是独立文件保存目标路径,硬链接则是新增文件名与inode的映射关系。特别指出目录硬链接数的计算规则(硬链接数-2=子目录数)和系统对目录硬链接的限制。 在动静态库部分,阐述了动态链接(默认)和静态链接(-static)的区别,介绍了ldd和file命令查看链接信息的方法。详细说明了库文件命名规则(如libstdc++.so的库名为stdc++)和库的本质(编译后的
2026-03-02 08:30:24
327
原创 C++ IO流
C++的IO流体系包括标准输入输出流、文件流和字符串流,均继承自ios_base基类。iostream头文件定义了istream/ostream类及其宽字符版本,包含cin/cout等全局对象,支持内置类型的输入输出操作。cin/cout通过运算符重载实现链式调用,其返回值可隐式转换为bool类型用于循环控制。文件流(ifstream/ofstream/fstream)支持文本和二进制文件的读写操作,通过open()函数指定打开模式。ios_base类提供了流状态控制(iostate枚举)和缓冲区同步(sy
2026-03-01 21:08:37
296
原创 C++ 继承
C++继承机制详解:从概念到实践 摘要:本文系统介绍了C++继承机制的核心概念与应用。继承是面向对象编程实现代码重用的重要手段,允许派生类继承基类的属性和方法。文章首先阐述了继承的基本概念,包括三种继承方式(public/protected/private)及其访问权限控制规则,重点分析了基类与派生类之间的赋值转换(切片)机制。随后探讨了继承中的作用域问题,解释了成员隐藏(重定义)现象及其解决方法。最后详细讲解了派生类默认成员函数的实现规则,强调派生类必须调用基类对应函数来初始化基类成员。通过代码示例展示了
2026-03-01 21:06:05
401
原创 C++ 位图&布隆过滤器
哈希表衍生出的位图和布隆过滤器是解决海量数据查找问题的有效方法。位图通过比特位表示数据存在状态,大幅节省空间(40亿整数仅需0.5GB)。布隆过滤器则通过多个哈希函数将任意类型数据映射到位图中,实现快速查找,但存在一定误判率。两种数据结构适用于不同场景:位图适合处理整数存在性判断,布隆过滤器可扩展至字符串等复杂类型。文中还给出了位图实现代码及典型应用场景,如查找仅出现一次的整数和文件交集问题,展示了这两种数据结构在大数据处理中的高效性和实用性。
2026-03-01 21:04:55
345
原创 C++ STL之stack&queue
本文介绍了C++中的容器适配器概念,重点讲解了stack和queue的实现原理及使用方法。容器适配器通过封装底层容器(如deque、vector等)提供特定操作,使它们行为上表现为新容器类型。stack适配器支持LIFO操作,默认使用deque作为底层容器;queue适配器支持FIFO操作,同样默认使用deque。文章详细说明了它们的模板参数、成员函数,并提供了stack的具体实现代码示例,展示了如何通过不同底层容器实现相同接口。最后指出适配器对底层容器的要求,如stack不支持array和forward_
2026-03-01 21:03:54
374
原创 C++ STL之map&set
本文介绍了C++中的关联式容器,重点分析了set容器的特性与使用方法。关联式容器(如set、map等)与序列式容器的区别在于其内部存储顺序由元素性质决定,而非插入顺序。set是一种基于红黑树实现的有序不重复容器,元素不可修改但可插入删除。文章详细讲解了set的模板参数、成员类型以及常用成员函数,包括构造类、迭代器类、容量类和修改类操作(如insert、erase等)。通过代码示例展示了set的基本用法,包括元素插入、删除和遍历等操作,帮助读者理解set容器的核心功能和使用场景。
2026-03-01 21:02:20
519
原创 C++ 多态
本文探讨了C++中多态的实现原理与机制。研究基于32位Visual Studio 2022平台,重点分析了通过虚函数实现多态的技术细节。文章指出多态调用的两个必要条件:必须通过基类指针或引用调用虚函数,且派生类必须重写基类虚函数。详细介绍了虚函数重写的标准形式,并特别讨论了三种特殊情况:协变(返回类型可不同但需构成继承关系)、析构函数重写(编译器统一处理为destructor)以及派生类虚函数可省略virtual关键字。通过代码示例对比了隐藏与虚函数两种多态实现方式的差异,强调使用虚函数时调用行为取决于对象
2026-03-01 20:57:51
473
原创 C++异常
在一个大型项目中,通常是不同人员完成不同的模块。因而不能随意抛异常,否则外层模块的人因为不知道内层抛出的异常类型而没办法处理异常。因此公司往往会自定义一套继承的规范异常体系,这样大家都只需要捕获基类异常对象就可以了。//基类异常public:, _id(id){}protected:// 错误描述int _id;// 错误编号// 继承和多态//数据库层异常public:{}return str;private://缓存层异常public:{}
2026-03-01 20:57:03
651
原创 C++ 智能指针
上述代码看起来释放了内存,也不会抛异常,事实上,当内存资源紧张时, new可能会抛异常,如果在p2申请空间时抛异常,则会导致p1没有被释放;当要释放node1资源时,需要node2->prev析构,需要node2释放资源,需要node1->next析构,需要node1释放资源。也就是说,需要node1释放资源就需要node2释放资源,需要node2释放资源就需要node1释放资源。unique_ptr。当赋值重载时,先将原来指向的计数–,如果计数为0,还需要释放原来的资源,再将新的计数++
2026-03-01 20:56:11
572
原创 C++模板
数据结构栈可用于存放数据,栈中数组的类型决定存放数据的类型,C语言中为了实现泛型变成使用了typedef定义数据类型,但是这样做有2个缺点:一是每次更改类型时都需要更改头文件中的typedef,二是在一个程序中只能定义一种类型的栈(不能对同一个类型typedef多次)。在C++引入模板后,模板被应用于函数和类中,使用了模板的类称为类模板。类模板的定义与函数模板相似private:T* _a;int top;template。
2026-03-01 20:54:51
658
原创 <Linux>权限管理|权限分类|权限设置|权限掩码|粘滞位
权限可以用字符表示:rwxrwxrwx;可以用进制表示:777root用户或者文件目录的拥有者可以通过chmod改变权限root用户可以通过chown改变文件的拥有者,chgrp改变文件的所属组实际权限=最初权限&(~权限掩码)r权限表示是否可以读取文件内容w权限表示是否可以对文件的内容进行修改x权限表示是否可以执行该文件一般创建的文件都不具有可执行性,因此文件最初的权限是666r权限表示是否可以查看当前目录下所有的文件或子目录。
2023-11-19 09:41:32
398
原创 <C++>类和对象下|初始化列表|explicit static|友元|内部类|匿名对象|构造函数的优化
在类的构造函数体中,对成员属性写的操作叫做赋值,那么成员的初始化是在哪里进行呢?那我们定义对象时,成员属性是在那里定义的呢?成员属性在中定义。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式上述是我们显示写的初始化列表,若没有显示写,初始化列表会将内置类型变量设为初始值显示写初始化列表:注意:每个成员变量只能初始化一次,只能在初始化列表中出现一次类中若包含以下成员,必须放在初始化列表中进行初始化引用成员变量const成员变量无默认构造函
2023-11-18 23:19:58
216
原创 LeetCode110. 平衡二叉树
①终止条件:当左右子树高度差超过1时返回false;递归到空节点和叶子节点时,由于空节点和叶子节点都满足平衡二叉树的条件,所以直接返回true。只有每个节点的左右子树高度差不超过1才是平衡二叉树,因此可以递归解决。②转换为子问题:判断它的左、右子树是否都为平衡二叉树。
2023-06-04 12:55:43
139
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1