<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C++ on To the Moon</title><link>https://pycv.github.io/blog/tags/c++/</link><description>Recent content in C++ on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 12 Mar 2026 09:50:03 +0800</lastBuildDate><atom:link href="https://pycv.github.io/blog/tags/c++/index.xml" rel="self" type="application/rss+xml"/><item><title>彻底理解C++中的适配器模式！</title><link>https://pycv.github.io/blog/excerpts/2026-03-12-cpp-adapter-pattern/</link><pubDate>Thu, 12 Mar 2026 09:50:00 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-03-12-cpp-adapter-pattern/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/OzqzST-H9xC3XLp9fEh4GA" target="_blank" rel="noopener"&#10; &gt;彻底理解C++中的适配器模式！&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：8/10（推荐读原文）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;文章通过一个实际场景——将第三方日志库集成到现有系统——深入浅出地讲解了 C++ 中的适配器模式。从最简单的包装函数，到类适配器（继承），再到对象适配器（组合），逐步展示了解决接口不兼容问题的演进过程。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;适配器的本质&lt;/strong&gt;：在两个不兼容的接口之间搭建桥梁，让它们能够协同工作，而无需修改任何一方的代码&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;类适配器 vs 对象适配器&lt;/strong&gt;：类适配器使用多重继承，一个适配器只能绑定一个具体类；对象适配器使用组合持有基类指针，可以适配整个继承体系&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;组合优于继承&lt;/strong&gt;：继承是&amp;quot;我是什么&amp;quot;，编译时决定，绑定到具体类；组合是&amp;quot;我有什么&amp;quot;，运行时可以指向基类的任意子类，灵活性更高&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="补充要点"&gt;补充要点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;问题场景：系统有统一的 &lt;code&gt;ILogger&lt;/code&gt; 接口，第三方库 &lt;code&gt;FastLogger&lt;/code&gt; 接口完全不同（&lt;code&gt;std::string&lt;/code&gt; vs &lt;code&gt;const char*&lt;/code&gt;，&lt;code&gt;log()/error()&lt;/code&gt; vs &lt;code&gt;writeLog()&lt;/code&gt; + level）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;包装函数的局限：只能做简单转换，无法参与面向对象体系（比如注册到需要 &lt;code&gt;ILogger*&lt;/code&gt; 的容器中）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;类适配器示例：&lt;code&gt;class LoggerAdapter : public ILogger, public FastLogger&lt;/code&gt;，通过继承同时实现接口和复用实现&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;对象适配器优势：当第三方库新增 &lt;code&gt;HighPerfLogger&lt;/code&gt;、&lt;code&gt;LowPowerLogger&lt;/code&gt; 等变种时，同一个适配器类通过持有 &lt;code&gt;FastLogger*&lt;/code&gt; 基类指针即可适配所有子类&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;运行时切换实现：对象适配器可以在运行时更换被适配对象，实现动态切换日志实现&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Linux零拷贝技术终极指南：mmap、sendfile、splice、MSG_ZEROCOPY一次讲透</title><link>https://pycv.github.io/blog/excerpts/2026-03-10-linux-zero-copy-guide/</link><pubDate>Tue, 10 Mar 2026 20:08:00 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-03-10-linux-zero-copy-guide/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/--fMOnUWYIDRSZsKcWnLFw" target="_blank" rel="noopener"&#10; &gt;Linux零拷贝技术终极指南&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：8/10（推荐读原文）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;这篇文章系统讲解了 Linux 零拷贝技术，从传统 read+write 的 4 次数据拷贝、4 次上下文切换入手，逐一介绍 mmap、sendfile、splice、MSG_ZEROCOPY 四种零拷贝方案的原理、适用场景和限制。适合需要理解高性能 I/O 的后端开发者。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;传统 read+write 有多贵&lt;/strong&gt;：一次&amp;quot;读文件发网络&amp;quot;涉及 4 次上下文切换、4 次数据拷贝（2 次 DMA + 2 次 CPU），其中 2 次 CPU 拷贝是纯浪费&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;sendfile 是零拷贝起点&lt;/strong&gt;：Linux 2.1 引入，一个系统调用顶替 read+write，上下文切换从 4 次降到 2 次；配合 SG-DMA 网卡可做到 0 次 CPU 拷贝&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;splice 更灵活&lt;/strong&gt;：可在任意两个 fd 之间传数据（其中一个必须是 pipe），只传页面引用不传数据；Linux 2.6.23 后 sendfile 内部就是基于 splice 实现的&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MSG_ZEROCOPY 让普通 send 也能零拷贝&lt;/strong&gt;：Linux 4.14 引入，适合需要先处理数据（加密/压缩）再发送的场景，但仅对大数据块（&amp;gt;10KB）有收益&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="补充要点"&gt;补充要点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;mmap + write：减少一次 CPU 拷贝（从 4 次降到 3 次），但上下文切换还是 4 次&lt;/li&gt;&#10;&lt;li&gt;sendfile 限制：输入必须是文件，输出必须是 socket&lt;/li&gt;&#10;&lt;li&gt;Nginx 静态文件服务用 sendfile，配置 &lt;code&gt;sendfile on;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Kafka 消费者拉取消息用 sendfile，数据不进 JVM 堆，这是超高吞吐的核心原因之一&lt;/li&gt;&#10;&lt;li&gt;MSG_ZEROCOPY 需要等内核通知才能安全修改 buf，编程模型更复杂&lt;/li&gt;&#10;&lt;li&gt;小数据场景（&amp;lt;10KB）用 MSG_ZEROCOPY 反而更慢，页面 pin/unpin 开销超过拷贝本身&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>源码剖析：iostream的缓冲区设计</title><link>https://pycv.github.io/blog/excerpts/2026-03-09-iostream-streambuf-design/</link><pubDate>Mon, 09 Mar 2026 19:25:00 +0800</pubDate><guid>https://pycv.github.io/blog/excerpts/2026-03-09-iostream-streambuf-design/</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文由 AI 自动摘录整理，原始链接：&lt;a class="link" href="https://mp.weixin.qq.com/s/pbJuAXmUIeLcpP0Luh4Xag" target="_blank" rel="noopener"&#10; &gt;源码剖析：iostream的缓冲区设计&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;：8/10（推荐读原文）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;文章深入剖析 C++ iostream 的底层缓冲引擎 &lt;code&gt;std::streambuf&lt;/code&gt;，讲解其三组指针体系、核心虚函数机制、缓冲策略与性能优化技巧，以及如何通过继承 streambuf 实现高性能日志系统、加密流、内存映射流等高级应用。&lt;/p&gt;&#10;&lt;h2 id="核心观点"&gt;核心观点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;streambuf 是 iostream 的缓冲引擎&lt;/strong&gt;：作为所有 I/O 流的底层抽象，streambuf 是连接逻辑流操作与物理设备（文件、网络、内存）的桥梁&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;双重指针体系设计精妙&lt;/strong&gt;：输入缓冲区（eback/gptr/egptr）和输出缓冲区（pbase/pptr/epptr）分离，使 streambuf 能高效处理双向流（如 fstream）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;三种缓冲策略权衡性能与实时性&lt;/strong&gt;：无缓冲（实时但慢）、行缓冲（交互友好）、全缓冲（性能最优）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;同步与绑定是性能杀手&lt;/strong&gt;：&lt;code&gt;sync_with_stdio(false)&lt;/code&gt; + &lt;code&gt;cin.tie(nullptr)&lt;/code&gt; 可提升 2-5 倍 I/O 性能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="补充要点"&gt;补充要点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;核心虚函数&lt;/strong&gt;：underflow（缓冲区空时填充）、overflow（缓冲区满时刷新）、sync（同步到设备）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;格式化操纵器&lt;/strong&gt;：无参（dec/hex/fixed）和带参（setw/setprecision），需 &lt;code&gt;&amp;lt;iomanip&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;类型安全优势&lt;/strong&gt;：编译期类型检查、自动类型转换、支持用户自定义类型（重载 &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; 和 &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;输出优化&lt;/strong&gt;：避免频繁 &lt;code&gt;endl&lt;/code&gt;（会刷新），用 &lt;code&gt;'\n'&lt;/code&gt; 代替；使用 &lt;code&gt;ostringstream&lt;/code&gt; 批量输出&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;输入优化&lt;/strong&gt;：整行读取 + 手动解析；C++17 的 &lt;code&gt;std::from_chars&lt;/code&gt; 提供零分配快速解析&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;自定义 streambuf 应用&lt;/strong&gt;：时间戳日志系统、透明加密/解密流、内存映射零拷贝 I/O&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;缓冲区刷新时机&lt;/strong&gt;：缓冲区满、&lt;code&gt;endl&lt;/code&gt;/&lt;code&gt;flush&lt;/code&gt;、程序正常退出、输入操作前（cin 与 cout 绑定）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>