自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

左手是诗,右手是代码。

写成一点自己的东西

  • 博客(108)
  • 资源 (3)
  • 收藏
  • 关注

原创 编译防火墙(PIMPL):Pointer to Implementation 与 ABI / 库设计

改了一个类的私有成员或头文件依赖,却导致半个工程重新编译——这是 C++ 头文件模型的经典痛点。编译防火墙(compilation firewall),最常见实现是 PIMPL(Pointer to Implementation):在公开类里只留一个指向实现类的指针,把数据成员和重型 #include 藏进 .cpp。本文讲清 PIMPL 的写法、优势,以及对 ABI 稳定性、静态库 / 动态库 发布的影响,并说明代价与何时不必用

2026-10-29 11:54:38 236

原创 深入理解 Linux epoll:为什么它比 select 快?

本文深入解析了Linux内核中epoll的工作原理,回答了开发者常见的核心问题。通过对比select的O(n)时间复杂度,指出epoll采用事件驱动机制实现O(1)高效处理。关键点包括:1) epoll维护红黑树管理监听集合和Ready List存储活跃事件;2) 通过Wait Queue回调机制直接通知状态变化,避免全量扫描;3) epoll_wait仅检查非空的Ready List;4) 事件处理慢不会丢失但会导致延迟;5) Event Loop应保持轻量,耗时业务交由线程池。文章最后总结了epoll的

2026-08-07 08:00:00 538

原创 AVL 树完全指南:从二叉搜索树到自平衡,插入 / 删除 / 四种旋转

AVL-自平衡二叉搜索树

2026-06-09 16:17:54 171

原创 CRTP 与静态多态:不用虚函数也能多态

把派生类自身作为模板参数传给基类——是 C++ 里实现**编译期多态**的经典手段。

2026-06-02 17:31:04 219

原创 Boost.Asio 线程模型对比:单 io_context + strand vs 多 io_context + 单线程

少量线程 + 任意多虚拟串行通道”,胜在效率、灵活、API 标准、有 work stealing,输在隔离弱、心智模型重、调度不确定。适合:串行单位多、负载分布动态、追求并发吞吐的系统。典型场景:网络服务器、消息分发层。“线程数 = 关键串行单位数,各自跑各自的”,胜在强隔离、易监控、cache 友好、心智简单,输在没有 work stealing、资源开销大、扩展性差。适合:实时关键路径、负载分布稳定、需要可观测和分级 supervise 的关键服务。

2026-05-18 16:02:47 466

原创 动态规划 (Dynamic Programming) 入门到实战:状态、转移与 C++ 写法

动态规划 = 定义状态 + 写对转移 + 按正确顺序算一遍。与回溯不同:回溯重在「枚举所有解」,DP 重在「重叠子问题 + 最优或计数」。先写出暴力递归,标出参数即状态;再加memo或改成for 循环填表。0-1 背包一维要倒序,完全背包一维常要正序—— 这是面试里极高频的细节。「状态最少需要几个维度才能描述局面?答案往往就是突破口。

2026-05-07 11:16:51 274

原创 Ollama 本地部署编程大模型 + Zed 编辑器配置指南

隐私顾虑:核心业务逻辑或涉密代码不便上传云端。网络延迟:即时补全对延迟要求极高,网络波动影响体验。成本问题:长期订阅费用是一笔开支。Ollama作为目前最流行的本地大模型运行工具,极大简化了部署流程。配合Zed这款基于 Rust 开发、主打极致性能的编辑器,我们可以在消费级硬件上搭建一套完全免费、离线可用的结对编程环境。通过的组合,我们构建了一个零成本、低延迟、高隐私的本地 AI 编程环境。

2026-02-06 15:59:55 1899

原创 高性能网络编程终极对决:epoll vs IOCP vs io_uring(2026 更新版)

epoll是 Linux 下高性能服务器的标准配置(Nginx, Redis, Node.js)。优势:成熟、稳定、生态极其丰富。它利用红黑树管理连接,利用就绪链表返回事件,解决了轮询的 O(N) 性能问题。劣势:本质上还是Reactor。当数据量极大时,用户态和内核态之间的数据拷贝(read/write)依然占用 CPU 周期。技术的发展是一个轮回。Windows 早就使用的 Proactor 模式,Linux 终于通过 io_uring 追赶了上来,并且用更激进的“共享内存环形队列”实现了超越。

2026-02-05 17:39:33 1289

原创 C++20 协程实战:手写 Task、单线程调度器与 awaiter 的三个钩子

协程不是"更轻量的线程",而是。它不解决并行,只解决"理解了这一点,co_await就不再像魔法:它只是「检查能不能立刻完成 → 不能就把自己挂到某处 → 有人 resume 我时从这里返回」。本文用 130 行代码实现一个可co_await的Task和一个单线程调度器,跑出可观测的交错执行,然后把最容易踩的坑一次说完。

2026-10-30 18:09:12 339

原创 无锁队列实战:SPSC 环形缓冲区、MPSC 抢占与 memory_order 选型

无锁队列」这四个字里,是次要的,才是主要的。只有一个生产者、一个消费者时(SPSC),一个互斥量都不需要,一对releaseacquire就够了;多生产者时(MPSC),真正要先解决的是「怎么抢槽位」;而最容易被忽略的是——这一层写错,在 x86 上跑一万次都对,换到 ARM 上立刻拿到半截数据。本文给出两个能直接编译运行的实现(SPSC 有界环、MPSC 有界环),并说清每个为什么必须是那一档。

2026-10-29 11:43:25 273

原创 实战:C++20 协程 + io_uring 写一个 400 行的 echo server

连接越多、状态越复杂(比如 HTTP 解析的中间状态),回调版的"状态机手工业"就越痛苦——协程把状态机交还给了编译器。

2026-10-28 09:56:13 324

原创 C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器

有兴趣可以关注一波。但如果把 handle 塞进了调度器队列而 Task 对象先析构了,调度器 resume 时就是 use-after-free。## 二、三个关键字与三类角色C++20 协程的 Participating 关键字只有三个:| 关键字 | 含义 | 典型用途 ||--------|------|----------||## 七、小结| 概念 | 一句话 ||------|--------|| 协程 | 编译器生成的状态机 + 堆上的帧 ||| 定制协程行为(何时启动/结束/存结果) ||

2026-10-27 10:42:58 335

原创 io_uring 入门:从 epoll 的 readiness 到 completion

epoll 让内核告诉你「可以读了」,io_uring 让内核告诉你「已经读完了」——前者把状态机留给你,后者把排队、执行、完成都收进内核,代价是你得显式管理上下文、缓冲区和失败降级。选型看的是「每连接 I/O 密度」,不是「谁更新」。

2026-10-26 08:54:49 149

原创 乏了<从2026回到2015的那天>

**时常会想这是不是我就要的生活,生活所陪伴的不是动听的音乐,不是繁华激荡的人生,而是一种和电脑交道的程序员,不是讨伐这个职业,只是觉得上班、下班的生活什么时候才会变成是另外一种生活的开首。心头萦绕一种乏…… 大冰的那一本《乖,摸摸头》收入当当阅读器很久了,总是慌张的扫过封面那个衣衫褴褛的孩子却再也腾不出一种心情进入书中,等到从书中出来却发觉已然凌晨一点,心下惴惴焉——已经多久没有读到这样的

2026-08-23 21:27:44 1251

原创 从零入门:eBPF 是什么、解决什么问题以及它的历史

eBPF(扩展伯克利包过滤器)是一种运行在Linux内核中的安全可编程执行环境,允许用户动态注入自定义逻辑而无需修改内核源码或加载模块。它解决了传统内核扩展方式的高风险、低可观测性和性能瓶颈问题。从最初网络包过滤的BPF演变为通用内核虚拟机,eBPF现已广泛应用于可观测性、高性能网络、系统安全等领域。其发展经历了五个关键阶段:1992年诞生、2013年重构、2015年追踪应用、2016年网络加速、2018年云原生成熟,最终成为现代Linux的核心基础设施。eBPF本质上是一个安全的内核插件系统,实现了"一次

2026-08-23 21:24:08 392

原创 std::variant 扩展:sum type、设计模式与异构容器

本文是**续篇**:按与 `variant` **贴得有多紧**梳理 State / Strategy / Command / ADT 等用法,并点到 Factory、Composite 等弱相关模式;再衔接 `optional` / `expected`、异构 `vector` 与 [crtp.md](./crtp.md) 的选型对照。

2026-07-30 17:46:20 208

原创 std::variant与std::visit:从访问者模式到类型安全联合

本文以**设计模式视角**串起 `variant` / `visit` / `monostate` / 常见坑;文末用**一小节**点到与 [CRTP 笔记](./crtp.md) 里「异构容器」话题的弱关联(不是主线)。

2026-07-23 16:58:30 208

原创 前缀和 (Prefix Sum) 完全指南:一维 / 二维 / 差分 / 哈希延伸

一维、二维区间查询→前缀和 + 容斥。区间修改、单点/整体查询→差分(本质上仍是前缀和)。统计满足某条件的子数组个数→前缀和 + 哈希表。异或类题目 →前缀异或 + 哈希表(和“+ 换 ^”的套路同构)。“只要一个量满足或,就可以把它前缀化。

2026-07-10 18:24:21 234

原创 字典树(Trie / 前缀树)完全指南:插入、查找、前缀与删除

Trie= 按字符(或 bit)分层的路由树,共享前缀,单次操作 O(键长)。子指针数组 / map+ is_end(+ 可选计数)。精确查找看末尾is_end;前缀查找只要求路径存在。删除先清标记,再在无分叉、无其它词时回收结点。需要前缀、词典、多词网格搜索时优先 Trie;只问成员是否存在用哈希往往更简单。Trie 的优势不在「单个单词查得快」,而在「很多单词共享前缀时,前缀类问题仍然只扫键长。

2026-07-08 16:54:57 191

原创 反转链表完全指南:辅助容器、三指针、头插法

**反转单链表**是面试与教材里极高频的一题:给定头结点,把 `1 → 2 → 3 → nullptr` 变成 `3 → 2 → 1 → nullptr`。

2026-06-15 14:28:24 450

原创 【空间压榨到倒计时】真 · O(1) 原地起飞:我与 AI 死磕 LeetCode 1260 的 6 阶进化录

从最初粗糙的 K次单步模拟 到直觉的 二维分块翻车;看到官方完美的 一维映射新矩阵解法;被激发出空间强迫症,跨越空间鸿沟推导出了 真 · O(1) 空间的环状多米诺置换(DFS与纯迭代);惊叹于 AI 抛出的 三次翻转美学;最终,用 最大公约数(GCD)定理 在数论层面实现终极闭环。刷题的乐趣从来不在于 AC 数量的堆砌,而在于你能不能在一个看似简单的官方及格方案后面,把问题的底层物理结构和数学本质,挖到它无法再优化的最尽头!

2026-06-11 21:35:29 339

原创 滑动窗口 (Sliding Window) 完全指南:定长 / 变长 / 单调队列

定长→ 窗口整体平移,维护一个累积量或单调队列。变长→ 右扩张、左收缩,用频数 / 集合判断合法性。窗口最值→单调队列(下标单调 + 队首过期弹出)。没有「扩右 / 缩左」的单调结构时,不要强行滑窗,改用前缀和 / 哈希等。「双指针」本质是每条边只朝一个方向走,总移动次数线性 —— 这是滑动窗口能O(n)的根本原因。

2026-05-26 10:28:37 435

原创 C++20/23 Ranges:从「迭代器对」到「可组合管道」

是有begin()end()(或满足概念)的对象;在管道里惰性变换;统一用整段序列调用。本文面向已经会写的读者,讲清核心心智模型、常用视图、与算法配合的写法,以及几个真实项目里最容易踩的坑。

2026-05-13 16:51:56 472

原创 std::string vs std::string_view

字符串的所有者:深拷贝、可变、自管理内存、\0结尾。字符串的"借用"视图:浅引用、只读、不管理内存、不保证\0。能用当只读形参,就不要用,这是现代 C++ 最容易拿到的性能红利之一。但绝不是"免费午餐":它是个带指针的借用语义,所有悬空、失效的规则都适用。要写入 / 要持有,用string;只读 / 只看,用。

2026-04-24 03:45:00 385

原创 C++ 内存到底分配在哪?

这是一个看似简单却能把人问倒的问题。很多人会脱口而出"new就是堆、局部变量就是栈",其实远不止这样 —— C++ 里还有。本文按""为主线梳理,这是 C++ 标准真正用的术语。

2026-04-22 11:28:32 393

原创 std::forward简明

`std::forward` 是 C++11 引入的一个工具,用于在**模板函数**中实现**完美转发(perfect forwarding)**:保持参数的值类别(左值/右值)不变地传递给下一个函数。

2026-04-21 14:25:20 402

原创 现代 C++ 异步编程:从零实现一个高性能 ThreadPool (C++20 深度实践)

实现一个线程池不难,但实现一个既类型安全又内存无忧的线程池需要对 C++ 的底层机制有深刻理解。解决了异质任务的存储问题。解决了异步任务的生命周期问题。解决了线程资源的回收问题。这个短小精悍的实现,正是 C++ 现代化的魅力所在。版权声明:本文采用 CC BY-SA 4.0 协议,转载请注明出处。

2026-04-17 21:47:35 520

原创 C++20 Concepts:让模板编程从“黑魔法”走向“契约时代”

C++20 引入的 Concepts(概念) 是模板泛型编程自诞生以来最具革命性的进化。它将模板从“黑魔法”转变为一种类型安全、语义清晰、易于调试的现代化工程工具。

2026-04-03 12:20:24 337

原创 Valgrind 报错 “uninitialised value“ 与 std::optional 的隐藏陷阱

在 C++17 项目中,`std::optional` 是一个非常实用的类型,用于表示"值可能不存在"的语义。然而,在使用 Valgrind 进行内存检测时,`std::optional` 可能会触发一个令人困惑的误报:**Conditional jump or move depends on uninitialised value(s)**。

2026-03-24 17:49:31 417

原创 回溯算法 (Backtracking) 完全指南:从排列到组合,从去重到剪枝

理解回溯算法

2026-02-24 14:28:18 988

原创 简单的计时小工具

一个小计时工具

2025-09-19 22:25:56 311

原创 新版本svn使用gpg-agent存储密码

自从开始使用debian11,应该是subversion版本的升级,导致不可以存储明文的密码,导致每次都要输入密码,很恼人。svn会缓冲auth的东西到~/.subversion/auth,为了使用gpg-agent,将老的东西删除。下边可以重新设置参数,当然还有其他参数,设置完成之后要重新启动gpg-agent。当第一次登录svn需要输入密码,之后密码会cache住直到失效,可以更改其配置。新版本的svn默认支持gpg-agent,那么问题演变成配置这个工具。Debian11的svn版本如下。

2023-11-30 10:06:10 1771 1

翻译 eBPF介绍

可惜是英文的,等我有空或者学会了,试着翻译一下。

2023-11-18 17:37:55 173

原创 安装使用分布式C/C++编译器distcc

distcc安装指南

2022-09-22 17:27:10 3040

原创 基于python3协程的log传输工具

python3 asyncio example

2022-09-12 09:52:06 673

原创 C++ https server based on boost asio and beast

目前在做的项目需要一个C++版本的https server,只能求助于boost库。幸运的是确实存在。并且提供了协程版本,本着学习的精神拿来改造一下,就获得了如下成果。AsyncHttpServerV2.hpp//// Created by chuanqin on 7/5/21.//#ifndef CBRS_UT_TOOL_ASYNCHTTPSERVERV2_HPP_#define CBRS_UT_TOOL_ASYNCHTTPSERVERV2_HPP_#include <algori

2021-07-07 18:09:30 1167

原创 某读书软件书籍导出想法

读书发现用读书软件很长时间了,这是一个很不错的软件。尤其是腾讯出品,自带社交加成,能方便的知道大家在读什么书。于是,读书开始变得没有那么闭塞,也减少了很多读完一本书之后的慌张。虽然我是程序员。可是,发现最近读的技术书籍反而越来越少,文学乃至小说反而越来越多。或许是职业的缘故,或许是生活节奏的缘故,不管怎么说这算是一个好习惯。有时候一周能读10个小时,不过最近发现能保持一天读一个小时就很不错,尤其是家里还有小孩子。一个想法读书软件既然是+讯的作品,肯定天然就带有腾讯的尿性,要做任务增加免费天数,为了

2021-03-15 17:50:16 730 1

翻译 Boost.Asio翻译

最近在写自己的小应用的时候,开始涉及到boost.asio,之前在项目中也没有系统性的学习过。于是,趁着这个时间好好学习一下。最好的入门资料当然是boost的官方文档,将几篇翻译的文档放在下边。声明,我当然不会投入巨大的精力翻译这样的文档,从某种严格意义上来讲,我是在必应或者谷歌提供的翻译基础上做了一些校对,使句子不那么显得机器。Boost.asio理由(Rationale)大多数程序以...

2020-04-18 21:35:13 509

原创 解决Mac使用wine安装的软件中文显示成方块的问题

毫无疑问Mac的体验相较于Windows有之质的区别。由于,平台的差异导致很多软件不兼容,尤其是使用某个平台的特定API导致很难迁移。Wine这是一个在非Windows平台运行Windows软件成为可能的软件。这是一个开源的软件,在其基础上有很多包装了Wine的软件,比如Crossover,这也是wine官方推荐的,这是收费的。wine好像不翻墙的话,不好下载,附上自己的百度云:链接:ht...

2020-04-11 16:56:00 6601

原创 Pytest debug/C++ debug

Python/C++ debugdebug的方式有很多最简单的方式是打印log,看log,这个的缺点是比较慢,尤其是用加log的方式来缩小怀疑的范围。因为这是一个不断迭代的过程,最主要的原因,一开始不知道代码哪个地方有问题。只能在所有可能有问题的地方加打印log。然后逐步的缩小怀疑范围。下边介绍一种快速的debug方法。UT debug什么是UT一半正儿八经的公司,一定会设计UT,UT是对...

2020-03-16 16:35:44 2100

stopwatch.jar

stopwatch.jar

2025-09-19

python-3.8.8-macosx10.9.pkg

python mac 3.8.8

2021-03-23

server:client.7z

这是工作中用到的一个工具,测试环境隔离在实验室,有一个PC和其相连,这个PC是可以连接网络的,测试设备通过udp端口向外发送信息,比如log,sever.py监听udp端口,将收到的消息,直接转发给在这个文件中起来的tcp server,外界的PC可以直接连接这个server获取测试设备发出的信息。

2020-04-11

空空如也

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

TA关注的人

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