C++ Coroutines
C++20 引入的协程(Coroutines)是一种可暂停、可恢复的函数。普通函数从入口跑到结尾一次性完成;协程可以在中途挂起(suspend),把控制权交还调用者,之后从挂起点继续执行。 类比:普通函数是一段单次播放的录音;协程是可以暂停、续播、还能边播边产值的播放器。 核心价值:用同步的线性代码风格写出异步逻辑,避免回调地狱与状态机手写。但 C++20 只提供“协程机制”(编译器变换 + 库支持),不提供开箱即用的异步框架——这是 C++ 协程学习曲线陡峭的根源。 三个关键字 C++ 协程由三个新关键字驱动,任一函数出现它们即被编译器识别为协程: 关键字 作用 co_await expr 挂起当前协程,等待一个 Awaitable 完成,再取回结果恢复 co_yield expr 产出一个值并挂起(生成器模式) co_return expr 协程结束,返回最终值 协程不能有普通 return,返回类型也必须是协程返回对象(如 Task<T>、generator<T>),而非裸值。 协程的骨架:promise_type 协...
C++ Smart Pointers
裸指针(new/delete)的两大顽疾:忘记释放导致内存泄漏,重复释放或异常路径跳过释放导致未定义行为。智能指针用 RAII 把“获取即初始化”贯彻到指针上——构造时持有资源,析构时自动释放,从而让资源管理与控制流解耦。 C++11 后标准库提供三类智能指针(均在 <memory>):std::unique_ptr、std::shared_ptr、std::weak_ptr,加上已废弃的 std::auto_ptr。理解它们的关键不是 API,而是所有权模型。 所有权模型三问 选哪个智能指针,只需回答三个问题: 问题 答案 选择 资源是否独占? 是 unique_ptr 是否需要共享? 是 shared_ptr 是否需要观察但不拥有? 是 weak_ptr 默认选 unique_ptr,需要共享才升级到 shared_ptr。绝大多数场景独占就够。 unique_ptr:独占所有权 unique_ptr 表达严格独占:同一时刻只有一个 unique_ptr 拥有该对象。它不可拷贝,只能移动。 123std::unique_ptr<W...
C++ Templates
模板是 C++ 的编译期多态与元编程基石。同一份模板代码,编译器根据传入的类型生成不同实例,实现“一次编写,多类型复用”,且零运行时开销。模板把“类型”当作一等公民,在编译期进行计算与分发。 类比:模板是“代码模具”,注入不同类型(材料)压出不同实例(零件)。 模板的两大用途:泛型编程(容器、算法与类型无关)与模板元编程(TMP,编译期计算)。本文聚焦模板本身的核心机制,约束部分见 [[cxx-concept]]。 函数模板与类模板 1234567891011// 函数模板template<typename T>T maxOf(T a, T b) { return a > b ? a : b; }// 类模板template<typename T, size_t N>class Array { T data[N];public: T& operator[](size_t i) { return data[i]; }}; typename 与 class 在模板参数列表...
Java25 新特性
Java 25 是继 Java 21 之后的又一个长期支持(LTS)版本,于 2025 年 9 月 16 日发布,包含 18 个 JEP。Java 21 引入的虚拟线程、记录模式等在 25 中继续打磨成熟,同时 25 带来了模块导入、紧凑源文件、作用域值正式化等一批新特性,并在 AOT 提前编译、对象头压缩、JFR 可观测性等方面有显著提升。以下是对 Java 25 相比 Java 21 的主要新特性的详细总结,重点突出其提升,并尽量简洁: 语言特性改进 紧凑源文件与实例 main 方法(Compact Source Files and Instance Main Methods,JEP 512,Java 25 正式化) 允许省略类声明、String[] args 参数和 public static 修饰符,直接写一个 main 方法即可运行,新手和脚本场景更友好;同时默认隐式导入 java.io.IO,可直接用 println、readln 等方法。 示例: 12345// 整个文件就这一段,无需 class 包装void main() { Str...
Java Class
类(class)是 Java 面向对象编程的基本构建单元,它既是数据抽象的载体,也是行为封装的边界。理解 class 的核心内容,本质上是理解 Java 如何用类型系统组织数据与行为。本文从现代 Java(25 LTS)视角出发,梳理 class 设计的核心要素。 类的本质:状态与行为的封装 一个 class 由两部分构成:字段(状态)和方法(行为)。封装的目的是把可变状态收敛到最小范围,对外只暴露不可变视图。 123456789101112public final class User { private final String name; // 不可变状态 private final String email; public User(String name, String email) { this.name = Objects.requireNonNull(name); this.email = Objects.requireNonNull(email); } public St...
C++ 中的 const 家族
C++ 里有三个"编译期求值"相关的关键字:constexpr、consteval、constinit。名字里都带 const,但职责各不相同——一个承诺"编译期可算",一个强制"只能在编译期算",一个解决"静态变量别出初始化顺序问题"。这篇把三者一次性梳理清楚。 一张表先建立全局印象 关键字 作用于 求值时机 能否修改 constexpr 变量、函数 必须可在编译期求值 否 consteval 函数 仅编译期,禁止运行期调用 — constinit 静态/线程存储期变量 编译期初始化 是(运行期可改) 记住一句话:constexpr 管"编译期可算",consteval 管"只能在编译期算",constinit 管"静态变量别出初始化顺序坑"。 constexpr:编译期就能算出来 constexpr(constant expression)要求对象或函数必须能在编译期求值。相比只承诺"运行期不可改&q...
Intel TBB
TBB (Threading Building Blocks) 是 Intel 出品的 C++ 并行编程库,也贡献给了 oneAPI 项目(oneAPI TBB)。它提供了高层抽象的任务并行、并行算法、并发容器和同步原语,让开发者不用直接操作 pthread/win32 thread 就能写出跨平台的高效并行程序。 安装与配置 获取方式 oneAPI TBB(推荐):https://github.com/oneapi-src/oneTBB 包管理器:Ubuntu 下 apt install libtbb-dev,macOS 下 brew install tbb CMake 集成 12find_package(TBB REQUIRED)target_link_libraries(my_app PRIVATE TBB::tbb) 头文件引用 12345#include <tbb/tbb.h> // 全量包含(方便但不推荐)#include <tbb/parallel_for.h> // 按需包含(推荐)#include <tbb/b...
vite_handbook
Vite 是当前前端工程里最值得掌握的构建工具之一。它的核心思路很直接:开发时利用浏览器原生 ESM 按需加载,借助高性能预构建和插件体系,把“启动慢、热更新慢、构建慢”这些老问题尽量压到最低。 如果你已经熟悉 Webpack,那么理解 Vite 的方式可以简单粗暴一点:它不是在开发阶段先把整个应用打成一个大包再提供给浏览器,而是让浏览器直接加载源码模块,只有确实需要的依赖和资源才会被处理。这样一来,项目越大,体验差异越明显。 Vite 到底解决了什么 传统打包器在开发模式下通常要做两件事:分析依赖图和重新生成 bundle。项目一旦变大,这个过程就会变慢,热更新也会被牵连。Vite 则把开发期和生产期分开处理:开发期更像一个高性能的本地服务器,生产期才交给 Rollup 做最终打包。 它的优势主要体现在几个方面。 启动快:不用先全量打包,直接启动开发服务器。 HMR 快:热更新只影响变化的模块,而不是整个应用。 配置相对简单:大多数常见场景开箱即用。 插件生态清晰:开发和构建阶段都能通过插件扩展。 对于 Vue、React、Svelte、Solid 这类现代框架,Vite ...
前端调试技巧与工具大全
浏览器开发者工具 Chrome DevTools 核心功能 Console 面板 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091// 基础输出console.log('普通日志');console.info('信息日志');console.warn('警告日志');console.error('错误日志');// 格式化输出console.log('字符串: %s', 'hello');console.log('数字: %d', 42);console.log('对象: %o', { name: '张三...
前端工程化工具链:ESLint、Prettier、Tailwind CSS
ESLint ESLint 是 JavaScript 和 TypeScript 的代码检查工具,用于发现和修复代码中的问题。 安装与配置 12345678# 安装 ESLintnpm install -D eslint# 初始化配置(交互式)npx eslint --init# 或手动安装推荐的配置npm install -D eslint @eslint/js typescript-eslint ESLint v9+ 扁平配置 ESLint v9 使用新的扁平配置文件 eslint.config.js。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108// eslint.config.jsimport...



