<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[左手是诗，右手是代码。]]></title><description><![CDATA[写成一点自己的东西]]></description><link>https://blog.csdn.net/u011233383</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; u011233383]]></copyright><item><title><![CDATA[编译防火墙（PIMPL）：Pointer to Implementation 与 ABI / 库设计]]></title><link>https://blog.csdn.net/u011233383/article/details/163829244</link><guid>https://blog.csdn.net/u011233383/article/details/163829244</guid><author>u011233383</author><pubDate>Thu, 29 Oct 2026 11:54:38 +0800</pubDate><description><![CDATA[改了一个类的私有成员或头文件依赖，却导致半个工程重新编译——这是 C++ 头文件模型的经典痛点。
编译防火墙（compilation firewall），最常见实现是 PIMPL（Pointer to Implementation）：在公开类里只留一个指向实现类的指针，把数据成员和重型 #include 藏进 .cpp。
本文讲清 PIMPL 的写法、优势，以及对 ABI 稳定性、静态库 / 动态库 发布的影响，并说明代价与何时不必用]]></description><category></category></item><item><title><![CDATA[无锁队列实战：SPSC 环形缓冲区、MPSC 抢占与 memory_order 选型]]></title><link>https://blog.csdn.net/u011233383/article/details/169446769</link><guid>https://blog.csdn.net/u011233383/article/details/169446769</guid><author>u011233383</author><pubDate>Thu, 29 Oct 2026 11:43:25 +0800</pubDate><description><![CDATA[无锁队列」这四个字里，是次要的，才是主要的。只有一个生产者、一个消费者时（SPSC），一个互斥量都不需要，一对releaseacquire就够了；多生产者时（MPSC），真正要先解决的是「怎么抢槽位」；而最容易被忽略的是——这一层写错，在 x86 上跑一万次都对，换到 ARM 上立刻拿到半截数据。本文给出两个能直接编译运行的实现（SPSC 有界环、MPSC 有界环），并说清每个为什么必须是那一档。]]></description><category></category></item><item><title><![CDATA[实战：C++20 协程 + io_uring 写一个 400 行的 echo server]]></title><link>https://blog.csdn.net/u011233383/article/details/169340556</link><guid>https://blog.csdn.net/u011233383/article/details/169340556</guid><author>u011233383</author><pubDate>Wed, 28 Oct 2026 09:56:13 +0800</pubDate><description><![CDATA[连接越多、状态越复杂（比如 HTTP 解析的中间状态），回调版的"状态机手工业"就越痛苦——协程把状态机交还给了编译器。]]></description><category></category></item><item><title><![CDATA[C++20 协程入门实战：从 co_await 到一个 100 行的异步任务调度器]]></title><link>https://blog.csdn.net/u011233383/article/details/169246943</link><guid>https://blog.csdn.net/u011233383/article/details/169246943</guid><author>u011233383</author><pubDate>Tue, 27 Oct 2026 10:42:58 +0800</pubDate><description><![CDATA[有兴趣可以关注一波。但如果把 handle 塞进了调度器队列而 Task 对象先析构了，调度器 resume 时就是 use-after-free。## 二、三个关键字与三类角色C++20 协程的 Participating 关键字只有三个：| 关键字 | 含义 | 典型用途 ||--------|------|----------||## 七、小结| 概念 | 一句话 ||------|--------|| 协程 | 编译器生成的状态机 + 堆上的帧 ||| 定制协程行为（何时启动/结束/存结果） ||]]></description><category></category></item><item><title><![CDATA[io_uring 入门：从 epoll 的 readiness 到 completion]]></title><link>https://blog.csdn.net/u011233383/article/details/169135276</link><guid>https://blog.csdn.net/u011233383/article/details/169135276</guid><author>u011233383</author><pubDate>Mon, 26 Oct 2026 08:54:49 +0800</pubDate><description><![CDATA[epoll 让内核告诉你「可以读了」，io_uring 让内核告诉你「已经读完了」——前者把状态机留给你，后者把排队、执行、完成都收进内核，代价是你得显式管理上下文、缓冲区和失败降级。选型看的是「每连接 I/O 密度」，不是「谁更新」。]]></description><category></category></item><item><title><![CDATA[乏了＜从2026回到2015的那天＞]]></title><link>https://blog.csdn.net/u011233383/article/details/45847445</link><guid>https://blog.csdn.net/u011233383/article/details/45847445</guid><author>u011233383</author><pubDate>Sun, 23 Aug 2026 21:27:44 +0800</pubDate><description><![CDATA[**时常会想这是不是我就要的生活，生活所陪伴的不是动听的音乐，不是繁华激荡的人生，而是一种和电脑交道的程序员，不是讨伐这个职业，只是觉得上班、下班的生活什么时候才会变成是另外一种生活的开首。心头萦绕一种乏……
    大冰的那一本《乖，摸摸头》收入当当阅读器很久了，总是慌张的扫过封面那个衣衫褴褛的孩子却再也腾不出一种心情进入书中，等到从书中出来却发觉已然凌晨一点，心下惴惴焉——已经多久没有读到这样的]]></description><category></category></item><item><title><![CDATA[从零入门：eBPF 是什么、解决什么问题以及它的历史]]></title><link>https://blog.csdn.net/u011233383/article/details/157939282</link><guid>https://blog.csdn.net/u011233383/article/details/157939282</guid><author>u011233383</author><pubDate>Sun, 23 Aug 2026 21:24:08 +0800</pubDate><description><![CDATA[eBPF（扩展伯克利包过滤器）是一种运行在Linux内核中的安全可编程执行环境，允许用户动态注入自定义逻辑而无需修改内核源码或加载模块。它解决了传统内核扩展方式的高风险、低可观测性和性能瓶颈问题。从最初网络包过滤的BPF演变为通用内核虚拟机，eBPF现已广泛应用于可观测性、高性能网络、系统安全等领域。其发展经历了五个关键阶段：1992年诞生、2013年重构、2015年追踪应用、2016年网络加速、2018年云原生成熟，最终成为现代Linux的核心基础设施。eBPF本质上是一个安全的内核插件系统，实现了"一次]]></description><category></category></item><item><title><![CDATA[深入理解 Linux epoll：为什么它比 select 快？]]></title><link>https://blog.csdn.net/u011233383/article/details/163543209</link><guid>https://blog.csdn.net/u011233383/article/details/163543209</guid><author>u011233383</author><pubDate>Fri, 07 Aug 2026 08:00:00 +0800</pubDate><description><![CDATA[本文深入解析了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的]]></description><category></category></item><item><title><![CDATA[std::variant 扩展：sum type、设计模式与异构容器]]></title><link>https://blog.csdn.net/u011233383/article/details/163341478</link><guid>https://blog.csdn.net/u011233383/article/details/163341478</guid><author>u011233383</author><pubDate>Thu, 30 Jul 2026 17:46:20 +0800</pubDate><description><![CDATA[本文是**续篇**：按与 `variant` **贴得有多紧**梳理 State / Strategy / Command / ADT 等用法，并点到 Factory、Composite 等弱相关模式；再衔接 `optional` / `expected`、异构 `vector` 与 [crtp.md](./crtp.md) 的选型对照。]]></description><category></category></item><item><title><![CDATA[std::variant与std::visit：从访问者模式到类型安全联合]]></title><link>https://blog.csdn.net/u011233383/article/details/163138336</link><guid>https://blog.csdn.net/u011233383/article/details/163138336</guid><author>u011233383</author><pubDate>Thu, 23 Jul 2026 16:58:30 +0800</pubDate><description><![CDATA[本文以**设计模式视角**串起 `variant` / `visit` / `monostate` / 常见坑；文末用**一小节**点到与 [CRTP 笔记](./crtp.md) 里「异构容器」话题的弱关联（不是主线）。]]></description><category></category></item><item><title><![CDATA[前缀和 (Prefix Sum) 完全指南：一维 / 二维 / 差分 / 哈希延伸]]></title><link>https://blog.csdn.net/u011233383/article/details/162769550</link><guid>https://blog.csdn.net/u011233383/article/details/162769550</guid><author>u011233383</author><pubDate>Fri, 10 Jul 2026 18:24:21 +0800</pubDate><description><![CDATA[一维、二维区间查询→前缀和 + 容斥。区间修改、单点/整体查询→差分（本质上仍是前缀和）。统计满足某条件的子数组个数→前缀和 + 哈希表。异或类题目 →前缀异或 + 哈希表（和“+ 换 ^”的套路同构）。“只要一个量满足或，就可以把它前缀化。]]></description><category></category></item><item><title><![CDATA[字典树（Trie / 前缀树）完全指南：插入、查找、前缀与删除]]></title><link>https://blog.csdn.net/u011233383/article/details/162701759</link><guid>https://blog.csdn.net/u011233383/article/details/162701759</guid><author>u011233383</author><pubDate>Wed, 08 Jul 2026 16:54:57 +0800</pubDate><description><![CDATA[Trie= 按字符（或 bit）分层的路由树，共享前缀，单次操作 O(键长)。子指针数组 / map+ is_end（+ 可选计数）。精确查找看末尾is_end；前缀查找只要求路径存在。删除先清标记，再在无分叉、无其它词时回收结点。需要前缀、词典、多词网格搜索时优先 Trie；只问成员是否存在用哈希往往更简单。Trie 的优势不在「单个单词查得快」，而在「很多单词共享前缀时，前缀类问题仍然只扫键长。]]></description><category></category></item><item><title><![CDATA[反转链表完全指南：辅助容器、三指针、头插法]]></title><link>https://blog.csdn.net/u011233383/article/details/162005934</link><guid>https://blog.csdn.net/u011233383/article/details/162005934</guid><author>u011233383</author><pubDate>Mon, 15 Jun 2026 14:28:24 +0800</pubDate><description><![CDATA[**反转单链表**是面试与教材里极高频的一题：给定头结点，把 `1 → 2 → 3 → nullptr` 变成 `3 → 2 → 1 → nullptr`。]]></description><category></category></item><item><title><![CDATA[【空间压榨到倒计时】真 · O(1) 原地起飞：我与 AI 死磕 LeetCode 1260 的 6 阶进化录]]></title><link>https://blog.csdn.net/u011233383/article/details/161902596</link><guid>https://blog.csdn.net/u011233383/article/details/161902596</guid><author>u011233383</author><pubDate>Thu, 11 Jun 2026 21:35:29 +0800</pubDate><description><![CDATA[从最初粗糙的 K次单步模拟 到直觉的 二维分块翻车；看到官方完美的 一维映射新矩阵解法；被激发出空间强迫症，跨越空间鸿沟推导出了 真 · O(1) 空间的环状多米诺置换（DFS与纯迭代）；惊叹于 AI 抛出的 三次翻转美学；最终，用 最大公约数（GCD）定理 在数论层面实现终极闭环。刷题的乐趣从来不在于 AC 数量的堆砌，而在于你能不能在一个看似简单的官方及格方案后面，把问题的底层物理结构和数学本质，挖到它无法再优化的最尽头！]]></description><category></category></item><item><title><![CDATA[AVL 树完全指南：从二叉搜索树到自平衡，插入 / 删除 / 四种旋转]]></title><link>https://blog.csdn.net/u011233383/article/details/161831702</link><guid>https://blog.csdn.net/u011233383/article/details/161831702</guid><author>u011233383</author><pubDate>Tue, 09 Jun 2026 16:17:54 +0800</pubDate><description><![CDATA[AVL-自平衡二叉搜索树]]></description><category></category></item><item><title><![CDATA[CRTP 与静态多态：不用虚函数也能多态]]></title><link>https://blog.csdn.net/u011233383/article/details/161630470</link><guid>https://blog.csdn.net/u011233383/article/details/161630470</guid><author>u011233383</author><pubDate>Tue, 02 Jun 2026 17:31:04 +0800</pubDate><description><![CDATA[把派生类自身作为模板参数传给基类——是 C++ 里实现**编译期多态**的经典手段。]]></description><category></category></item><item><title><![CDATA[滑动窗口 (Sliding Window) 完全指南：定长 / 变长 / 单调队列]]></title><link>https://blog.csdn.net/u011233383/article/details/161414653</link><guid>https://blog.csdn.net/u011233383/article/details/161414653</guid><author>u011233383</author><pubDate>Tue, 26 May 2026 10:28:37 +0800</pubDate><description><![CDATA[定长→ 窗口整体平移，维护一个累积量或单调队列。变长→ 右扩张、左收缩，用频数 / 集合判断合法性。窗口最值→单调队列（下标单调 + 队首过期弹出）。没有「扩右 / 缩左」的单调结构时，不要强行滑窗，改用前缀和 / 哈希等。「双指针」本质是每条边只朝一个方向走，总移动次数线性 —— 这是滑动窗口能O(n)的根本原因。]]></description><category></category></item><item><title><![CDATA[Boost.Asio 线程模型对比：单 io_context + strand vs 多 io_context + 单线程]]></title><link>https://blog.csdn.net/u011233383/article/details/161196691</link><guid>https://blog.csdn.net/u011233383/article/details/161196691</guid><author>u011233383</author><pubDate>Mon, 18 May 2026 16:02:47 +0800</pubDate><description><![CDATA[少量线程 + 任意多虚拟串行通道”,胜在效率、灵活、API 标准、有 work stealing,输在隔离弱、心智模型重、调度不确定。适合:串行单位多、负载分布动态、追求并发吞吐的系统。典型场景:网络服务器、消息分发层。“线程数 = 关键串行单位数,各自跑各自的”,胜在强隔离、易监控、cache 友好、心智简单,输在没有 work stealing、资源开销大、扩展性差。适合:实时关键路径、负载分布稳定、需要可观测和分级 supervise 的关键服务。]]></description><category></category></item><item><title><![CDATA[C++20/23 Ranges：从「迭代器对」到「可组合管道」]]></title><link>https://blog.csdn.net/u011233383/article/details/161054316</link><guid>https://blog.csdn.net/u011233383/article/details/161054316</guid><author>u011233383</author><pubDate>Wed, 13 May 2026 16:51:56 +0800</pubDate><description><![CDATA[是有begin()end()（或满足概念）的对象；在管道里惰性变换；统一用整段序列调用。本文面向已经会写的读者，讲清核心心智模型、常用视图、与算法配合的写法，以及几个真实项目里最容易踩的坑。]]></description><category></category></item><item><title><![CDATA[动态规划 (Dynamic Programming) 入门到实战：状态、转移与 C++ 写法]]></title><link>https://blog.csdn.net/u011233383/article/details/160851985</link><guid>https://blog.csdn.net/u011233383/article/details/160851985</guid><author>u011233383</author><pubDate>Thu, 07 May 2026 11:16:51 +0800</pubDate><description><![CDATA[动态规划 = 定义状态 + 写对转移 + 按正确顺序算一遍。与回溯不同：回溯重在「枚举所有解」，DP 重在「重叠子问题 + 最优或计数」。先写出暴力递归，标出参数即状态；再加memo或改成for 循环填表。0-1 背包一维要倒序，完全背包一维常要正序—— 这是面试里极高频的细节。「状态最少需要几个维度才能描述局面？答案往往就是突破口。]]></description><category></category></item></channel></rss>