通俗理解 Transformer
ChatGPT、Claude、Gemini……这些 AI 产品背后都有一个共同的核心架构——Transformer。这篇文章用最通俗的方式,帮你搞懂它到底是什么。 先讲个故事假设你在读一句话: “小明把苹果递给小红,因为她饿了。” 你一下就知道”她”指的是小红,因为”饿了”跟”接苹果”更相关。但对计算机来说,”她”可以指小明(如果小明是女性)也可以指小红。 Transformer 的核心能力,就是让计算机也能像你一样,理解一句话里每个词和其他词之间的关系。 在 Transformer 之前在 Transformer 出现之前(2017 年以前),处理语言的主流方法是 RNN(循环神经网络)。你可以把 RNN 想象成一个人从左到右、一个字一个字地读文章: 1我 → 今 → 天 → 很 → 开 → 心 这有一个致命问题:读到后面,前面的内容就记不清了。就像你读一本 500 页的小说,读到最后一章时,第一章的细节早就模糊了。 而且,因为是一个字一个字读的,所以没法并行处理,速度很慢。 Transformer 的核心思想Transformer 换了一个思路:不再一个字一个字读,...
现代 C++ 实战(07):C++17 工具箱
C++17 不像 C++11 / C++20 那样「改天换地」,却塞进了大量日常极好用的工具:std::any、std::filesystem、结构化绑定、if constexpr、折叠表达式、并行算法……写业务代码时经常伸手就能摸到。 这一篇把 C++17 工具箱里最常用的一批串起来,对应三个 demo:any_demo、filesystem_demo、parallel_algo_demo。 这是「现代 C++ 实战」系列的第 7 篇。建议先读 第 06 篇:Lambda 与类型推导。 一、std::any:运行期存任意类型C++17 的 std::any 是类型擦除容器——运行期可以换成 int、string、vector……类型信息保存在内部,取出时用 std::any_cast。 123456789#include <any>#include <string>std::any value = 42;value = std::string("hello"); // 可以改存别的类型value....
现代 C++ 实战(06):Lambda 与类型推导
智能指针解决「谁拥有资源」,Lambda 解决「怎么写小段逻辑」——回调、算法谓词、闭包、延迟执行,现代 C++ 里无处不在。从 C++11 的 [](){} 到 C++20 的模板 Lambda,每一版标准都在把它变强。 这一篇系统梳理 Lambda 语法、捕获方式、与 auto/decltype 的类型推导,并对比函数指针与 std::function 的取舍。 这是「现代 C++ 实战」系列的第 6 篇。对应 demo:ref/cpp_demo/basics/lambda_demo/。建议先读 第 05 篇:智能指针(下)。 一、基本语法:[](){} 四部分Lambda 的完整形式: 1[捕获列表](参数列表) 可选说明符 -> 返回类型 { 函数体 } 部分 含义 可省略? [...] 捕获列表:把外部变量「带进」闭包 空 [] 表示不捕获 (...) 参数列表,同普通函数 无参时可写 () 或省略 -> T 显式返回类型 可省略,编译器推导 {...} 函数体 不可省略 最小例子: 12a...
现代 C++ 实战(05):智能指针(下)——模式与循环引用
上一篇我们掌握了 unique_ptr 和 shared_ptr 的基本用法。但在真实项目里,智能指针不只是替代 new/delete——循环引用、工厂函数、Pimpl、Observer 等场景会逼你思考「谁该拥有、谁该观察」。 这一篇是智能指针的下半场:weak_ptr 如何打破循环引用,以及几种经典设计模式如何用智能指针落地。 这是「现代 C++ 实战」系列的第 5 篇。对应 demo:ref/cpp_demo/smart_pointers/ 第 05–09 节。建议先读 第 04 篇:智能指针(上)。 一、weak_ptr 与循环引用shared_ptr 的引用计数是双向的:A 持有 B,B 也持有 A 时,计数永远不归零——内存泄漏。 12345struct Node { std::shared_ptr<Node> next; // std::shared_ptr<Node> parent; // 危险:与子节点形成环 std::weak_ptr<Node> parent; // 安...
现代 C++ 实战(04):智能指针(上)——所有权与 RAII
上一篇我们搞懂了移动语义——资源可以在对象之间「搬家」。但还有一个更根本的问题:这块内存到底谁负责释放? C++ 没有垃圾回收,手动 new / delete 一旦配对出错,就是泄漏或 double-free。 现代 C++ 的答案是 RAII + 智能指针:把所有权写进类型系统,让编译器和析构函数帮你收尾。这一篇聚焦 unique_ptr 与 shared_ptr 的上半场——独占 vs 共享、什么时候该用谁、以及 make_unique / make_shared 为什么更推荐。 这是「现代 C++ 实战」系列的第 4 篇。对应 demo:ref/cpp_demo/smart_pointers/ 第 01–04 节。建议先读 第 03 篇:移动语义与右值引用。 一、RAII:资源获取即初始化RAII(Resource Acquisition Is Initialization) 是 C++ 资源管理的核心惯用法: 阶段 做什么 构造 获取资源(内存、文件句柄、锁……) 使用 通过对象访问资源 析构 自动释放资源——无论正常返回还...
现代 C++ 实战(03):移动语义与右值引用
上一篇我们把 C++ 版本地图铺好了。C++11 里有一项改动,几乎改变了整个语言写高性能代码的方式:移动语义(Move Semantics)。很多人第一次遇到 std::move 和 T&& 时会困惑:「这到底是在拷贝还是在移动?」 这一篇我们拆开来看:左值 / 右值是什么、std::move 做了什么、移动构造如何省掉深拷贝,并带你跑 right_ref_demo demo。 这是「现代 C++ 实战」系列的第 3 篇。对应 demo:ref/cpp_demo/basics/right_ref_demo/。建议先读 第 02 篇:C++ 版本演进一览。 一、为什么需要移动语义?想象你在搬家:把书从旧书架搬到新书架,有两种做法: 做法 类比 C++ 中的对应 复印 把每本书复印一份放到新家,旧家原件还在 拷贝构造——两份独立数据 直接搬 把书整箱抬走,旧书架空了 移动构造——资源所有权转移 对 std::string、std::vector 这类在堆上持有大块内存的类型,深拷贝意味着: 分配同等大小的新内存 逐字节复制内容...
现代 C++ 实战(02):C++ 版本演进一览
上一篇我们搞定了 CMake 构建。但在写代码之前,还有一个「地图」问题:C++ 到底演进了哪些版本?每个版本加了什么? 如果你还在用 C++98 的思维读 C++20 的代码,很容易觉得「语法怎么又变了」。 这一篇不深入任何单一特性,而是把 C++03 → C++26 的演进脉络梳理清楚,并带你跑一遍 version_features demo——后面 25 篇特性文章,都可以在这张地图上找到位置。 这是「现代 C++ 实战」系列的第 2 篇。对应 demo:ref/cpp_demo/basics/version_features/。建议先读 第 01 篇:CMake 与现代构建。 一、C++ 标准时间线C++ 不像 Python 那样每年一个大版本,而是 3~5 年发布一次国际标准(由 ISO 委员会制定)。对开发者来说,真正重要的是:编译器支持到了哪个 -std=。 标准 发布年份 __cplusplus 宏 常用编译 flag 定位 C++98 / C++03 1998 / 2003 199711L -std=c++03 经典 C+...
现代 C++ 实战(01):CMake 与现代构建
上一篇我们把环境跑通了。从这一篇开始,我们真正进入 C++ 工程的地基:CMake。本系列 39 个 demo 全部用 CMake 构建,其中 projects/fetch_content/ 是一个「集大成」示例——它用 FetchContent 自动拉取 gtest、json、fmt、spdlog 等 6 个第三方库,演示现代 C++ 项目最常见的依赖管理方式。 搞懂这篇,后面所有带外部库的 demo 你都不会慌。 这是「现代 C++ 实战」系列的第 1 篇。对应 demo:ref/cpp_demo/projects/fetch_content/。建议先读 第 00 篇:环境搭建与项目导览。 一、为什么需要 CMake?手写 Makefile 在小项目里够用,但现代 C++ 项目很快会遇到天花板: 痛点 Makefile 的局限 CMake 的做法 跨平台 Windows / macOS / Linux 语法不同 一套 CMakeLists.txt,生成对应平台的构建文件 依赖管理 手动下载、编译、写 -I / -L Fet...
现代 C++ 实战(00):环境搭建与项目导览
学现代 C++,最怕的不是语法多,而是 demo 跑不起来、编译器版本对不上、CMake 报错看不懂。这一篇我们不讲任何语言特性,只把「能编译、能运行、知道 39 个 demo 在哪」这件事搞定。后面 27 篇会在这个环境里,逐个拆解 C++11 到 C++23 的核心特性。 这是「现代 C++ 实战」系列的第 0 篇。本系列基于 ref/cpp_demo 的 39 个独立 CMake 项目,在 Docker 或 macOS 本地编译运行。下一篇我们从 CMake 与现代构建说起,搞懂 FetchContent 依赖管理。 一、为什么这样学?你可能已经会写 C++,但面对 C++11 之后的「现代 C++」,往往有这样的困惑:特性太多、标准迭代太快、书和博客各说各话。本系列的选择很克制: 选择 原因 Demo 驱动 每个知识点对应可编译、可运行的代码,不是纸上谈兵 39 个独立项目 每个子目录自包含,可单独拷贝到其他机器 统一 build.sh 所有 demo 同一套构建命令,降低切换成本 Docker + macOS 双环境 容器保证 Linux...
测试文章-Hello-2026
🎉 欢迎来到 2026 年!这是一篇测试文章,用于验证 Hexo 博客系统是否正常工作。 文章特点 ✅ 支持 Markdown 语法 ✅ 支持 Emoji 表情 ✅ 支持代码高亮 代码示例下面是一段 JavaScript 代码: 12345function greet(name) { console.log(`Hello, ${name}! Welcome to 2026!`);}greet('World'); 引用 学习是一种终身的事业。—— 某位智者 列表无序列表 第一项 第二项 第三项 有序列表 首先 然后 最后 表格 项目 描述 Hexo 静态博客框架 Butterfly 主题模板 GitHub Pages 托管服务 感谢阅读!🚀















