- 博客(50)
- 收藏
- 关注
原创 时间轮定时任务执行队列实现
最近在研究高性能网络框架时,我实现了一个基于时间轮的定时器。与传统实现不同的是,这个版本。它利用构建了一个环形队列,巧妙地利用的引用计数机制;当时间轮转动清空槽位时,引用计数归零触发析构,进而自动执行回调任务。本文将讲解如何利用Linux的timerfd配合C++的RAII机制,写出一个既高效又优雅的定时器。
2025-11-20 10:48:27
988
原创 MySQL索引
索引是用于加速数据检索的,现实生活中,索引类比书的目录:没有目录,当想要查看指定内容时,只能一页一页的查找是否找到了想要查看的指定内容,有了目录,可以快速查找到指定内容。在数据库系统中,存在大量数据,不通过索引检索数据会付出巨大的时间成本,通过索引可以快速检索出数据索引虽然提高了数据的查询速度,但在一定程度上也会降低数据增删改的效率,因为这时在对表中的数据进行增删改操作时,除了需要进行对应的增删改操作之外,可能还需要对底层建立的数据结构进行维护数据库索引的本质是为“读”加速,以“写”为代价。
2025-11-12 11:10:32
378
原创 MySQL表的约束
约束就是对表中数据的“规则限制”,用来保证数据的正确性、一致性和完整性。保证数据合法、可靠:防止负价格、空名字、乱填数据。保证每一行记录可唯一识别:主键 / 唯一约束让每条记录都有“身份证”。保证表与表之间的关系正确:外键约束保证订单一定有真实的用户和商品。体现并强制执行业务规则:手机号唯一、数量大于 0 等写死在库里。有利于性能与维护:部分约束自带索引,数据干净,后期维护成本更低。
2025-11-10 15:52:02
1025
原创 Linux进程控制
进程替换指的是**用一个全新的程序,去替换当前正在运行的进程的内存空间。进程的“躯壳”还在——进程ID (PID) 不会改变。但进程的“灵魂”已经换了——它的代码、数据、堆栈等所有内存内容,都被新的程序所覆盖。一个绝佳的比喻fork()是克隆:你复制出了一个和你一模一样的自己。现在世界上有两个你。exec()是夺舍/重生:你还是你(你的身份ID没变),但你的思想、记忆和所有技能都被另一个人完全取代了。你无法再变回原来的你了。一旦替换成功,原来的程序代码就永远消失了,进程会从新程序的main。
2025-10-03 15:25:23
825
原创 Linux进程概念
在 Linux 中,多个进程会竞争 CPU 资源。调度器根据 优先级 (priority) 来决定谁先运行。优先级高的进程,更容易被 CPU 调度。优先级低的进程,可能需要等待更久。在Linux中,进程优先级通常由两个值表示PRI和Nice。
2025-09-30 23:10:32
728
原创 C++11部分
C++11 是 C++ 标准十年来最重要的一次升级,被称为“现代 C++ 的起点”。它不仅引入了auto、Lambda 表达式、右值引用、智能指针等实用特性,还首次提供了语言级别的多线程支持。C++11 让代码更简洁、更安全、更高效,也为后续的 C++14/17/20 奠定了基础。本文将带你全面认识这一代标准的核心特性。左值有名字、可寻址、能在表达式结束后继续存在的对象。左值是一个表达式。能够被取地址有持久存储位置(栈,堆,全局区)示例:int x = 10;// x 是左值x = 20。
2025-09-26 18:10:01
978
原创 C++多态
C++多态(Polymorphism)同一个接口,可以有不同的实现方式;同一个操作,可以作用于不同类型的对象,并表现出不同的行为。编译时多态(如函数重载、运算符重载),在编译阶段就能确定调用的具体实现。运行时多态(主要依赖虚函数和继承机制),在程序运行过程中根据对象的实际类型来决定调用哪一个方法。打个比方,现实生活中“买票”就是一个统一的接口:普通人买票是全价;学生买票则可以享受优惠;但无论普通人还是学生,都是“人”这个大类的对象。
2025-09-24 19:14:06
1049
原创 C++模板速通与实战
声明只告诉编译器“有这个模板”。定义给出模板的主体隐式实例化发生在使用点(point of use)——比如你调用了,编译器必须当场拿到foo的定义,才能生成foo<int>的机器码。因此,把模板实现写进.cpp,而别的.cpp只#include了声明,是不行的-----用到它的那个.cpp看不到定义,无法实例化错误示例foo.hvoid bar();foo.cppvoid Foo<T>::bar() { // 定义在 .cppmain.cppFoo<int> f;f.bar();
2025-09-22 03:26:27
786
原创 C++new和delete
new/delete是 C++ 对的高级封装,负责内存管理 + 构造/析构new→deletenew[]→delete[]小心常见陷阱(泄漏、重复释放、悬空指针)高级用法:定位new适合自定义内存管理现代 C++ 推荐使用智能指针代替原始new/delete,除非在底层库或性能敏感场景中。
2025-09-18 15:50:56
655
原创 C++类的默认成员函数基础
构造函数是一种特殊的成员函数,名字与类名相同,没有返回类型,它会在对象创建时自动调用,用于初始化对象的成员函数例如public:int age;Person() { // 构造函数age = 0;Person p;// 自动调用 Person() 构造函数成员变量age就被初始化为0析构函数是一个特殊的成员函数,用于在对象销毁时自动调用,负责清理对象占用的资源。注意析构函数不是清理对象本身函数名和类名相同,但前面加上。没有返回值(连void都不能写)。不能有参数(因此也不能重载)。
2025-09-16 14:42:27
735
原创 C++类成员的内存对齐
类成员对齐是性能优先的权衡方案,用一点内存换取更快的访问速度编译器自动插入字节,保证每个成员按其自然边界对齐sizeof(类)是最大对齐数的整数倍。
2025-09-11 09:52:18
416
原创 C++类和对象初识
面向过程是一种以步骤和函数为核心的编程思想,强调“怎么做”,适合小型、逻辑清晰的程序;而面向对象则以对象及其属性和行为为核心,强调“谁来做”,通过封装、继承和多态实现更好的复用与扩展,适合构建大型、复杂、可维护的系统C++ 面向对象(OOP, Object-Oriented Programming)是一种程序设计思想,它将现实世界中的事物抽象成“对象”,通过对象之间的交互来完成程序功能。C++ 在 C 的基础上引入了类(class)和对象(object),使得它既支持面向过程(POP),又支持面向对象。
2025-09-10 19:18:25
718
原创 JavaScript中Promise
Promise 让异步操作更加可控,支持链式调用,避免回调地狱配合,代码逻辑更直观、可读性更强掌握等方法,可以更灵活地处理多个异步任务。
2025-09-05 11:33:38
754
原创 定长内存池
池化技术就是一次性准备好一堆资源,反复复用,避免频繁创建和销毁的一种性能优化思想.它的思路很简单–与其每次要用的时候去新建一个,不如提前建好一批,放在一个"池"里,需要就拿,用完再放回去它能显著增加系统运行时的性能,类比于你有一大批快递依次到达站点,你每次到达一个快递就去取一个快递必然会很麻烦,但如果你在最后一个快递到达站点或者一批快递到达站点再去领取,必然会显著增加性能.池化技术是一种"以空间换时间"的优化策略,牺牲一些内存(提前准备),换取运行时的速度和稳定性.它的思想在高性能编程里很常见.
2025-08-15 16:31:42
1065
原创 多路转接(I/O多路复用)
(I/O 多路复用,I/O Multiplexing)是一种它的作用是:当任何一个 I/O 通道有数据可读/可写时,通知程序进行相应的处理,而不需要为每个连接单独开一个线程阻塞等待.简单理解:普通模式:每个连接一个线程,线程阻塞在read()write()上.多路转接:一个线程统一监视所有连接,谁有事件就处理谁.
2025-08-12 11:43:24
777
原创 Cookie与Session
Cookie 与 Session 的协同工作,极大地推动了 Web 技术从“无状态传输”向“有状态交互”的转变.它们不仅有效弥补了 HTTP 协议无法记录用户状态的不足,还显著提升了用户信息的安全性。同时,这两项技术也为电商、社交和广告等领域的发展提供了坚实基础如果没有 Cookie 和 Session,用户每次访问网站都需要重新登录,购物网站也无法实现购物车等关键功能。
2025-07-10 10:52:10
881
原创 A. k-th equality(1700)
本质上是求满足条件的第k个二元组(a,b),考虑可以枚举a,通过c求出b的范围,进而得出以当前a为第一项满足条件的元组个数cnt,如果当前元组数量cnt小于k,则第k个满足条件的元组一定不在以当前a为第一项的范围内,k减去当前a元组数量,重新考虑a+1,当找到k<=cnt,可以得出答案,如果遍历所有a还不能找出答案则不存在第k个满足条件得式子。考虑所有形式为 a+b=c 的等式,其中 a有 A 位数, b 有 B 位数, c 有 C 位数。整数,求第k个满足式子的算式。
2025-04-18 12:10:37
338
原创 make/Makefile(自动化构建工具)
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命。规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。种在工程方面的编译方法。
2024-07-01 19:37:47
501
原创 Linux权限
在Linux系统中用户分为超级管理员和普通用户,超级管理员几乎不受权限约束,在Linux中一切皆文件,用户对文件的操作分为可读可写以及可执行三种.普通用户分为拥有者,所属组和其他构成.,针对不同用户,可以通过设置不同的权限进行管理.
2024-06-06 09:09:52
985
原创 有效三角形的个数
原理:先对数组排序,枚举三角形较小的两条边,再利用二分算法找到大于等于枚举两数之和最小的数,设下标为k,则枚举的数后面到k的数都是满足条件的。
2024-06-04 10:16:26
185
原创 一位十进制加法器设计
因为四位二进制最多表示十六种状态,而我们设计十进制加法进位器只需要用到前十位状态,十位后面的状态都是非法的,此时我们可以通过加六使得非法状态进位变成合法状态.
2024-05-29 01:40:36
2273
原创 乘积最大子数组
枚举每一位数字作为最后一位,记录以此位置的最大乘积和,同时还要一个数组记录最小乘积和,因为最后一位数字正负不确定,当为负数时要乘以前面最小的乘积和才最大。
2024-05-23 15:46:26
273
1
原创 数组变换(贪心加位运算)
已知所有数经过无限次乘以2之后相同,那么我们记录这组数据中最大的数.(因为最大的数是不需要进行乘以2的操作的,也就是说所有数要变得相同必须通过乘2的操作变成最大的数)
2024-05-10 09:38:19
255
1
原创 youyou的水果大礼包
当仅考虑n个苹果时,最多可以有n/2个一号大礼包,当仅考虑m个桃子时,最多有m个一号大礼包,但枚举一号礼包同时受到两个条件限制,故枚举的最多一号大礼包的个数只能是两者中取较小的那个.首先枚举可以组成一号水果大礼包的个数,再在枚举了一号大礼包的情况下枚举二号大礼包的个数从而得出正确答案.枚举完一号大礼包,剩下的苹果和桃子用来组成二号大礼包.
2024-04-27 13:26:14
262
原创 vector实现reserve功能出现的一个问题
由于memcpy进行的是按字节进行拷贝,而vector底层实现是指针,使用memcpy时将内容的地址进行了拷贝,而内容本身没有拷贝,即自定义类型本身内容进行了浅拷贝,当要释放旧的空间时,将本要复制的空间内容释放.当插入四个数据时,此时vector内数据个数等于容量,打印结果没有出现异常。出现这种现象的原因是扩容时采用了memcpy进行扩容。当再次插入一个数据,要进行扩容时,此时出现异常。
2024-04-22 18:51:38
257
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅