这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
C++ 并发设计模式:线程池、Future 与异步编程
C++11 的发布标志着现代 C++ 并发编程的开端。在此之前,开发者需要依赖平台特定的接口(如 POSIX pthreads 或 Windows API)来编写多线程程序,这不仅带来代码可移植性的问题,更使得并发逻辑与业务逻辑纠缠在一起。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
C++11 的发布标志着现代 C++ 并发编程的开端。在此之前,开发者需要依赖平台特定的接口(如 POSIX pthreads 或 Windows API)来编写多线程程序,这不仅带来代码可移植性的问题,更使得并发逻辑与业务逻辑纠缠在一起。
C++ 作为一门兼具高性能与复杂性的系统级语言,工程化实践直接关系到代码的可维护性、健壮性和团队协作效率。本文从代码规范、静态分析、单元测试、覆盖率、包管理和 CI/CD 六个维度,梳理现代 C++ 项目的工程实践体系。
C++11 标准库对并发编程进行了系统性重构,引入了 、 、 等核心头文件,让开发者无需依赖平台特定的 pthread 或 Win32 API,即可编写可移植的多线程代码。在此之前,C++ 开发者通常需要借助 Boost.Thread 或者直接调用操作系统底层 API,不仅代码可移植性差,而且容易因
C++ 基础语法完整回顾:引用与指针的本质区别、函数重载与默认参数、命名空间与作用域、const 正确性、I/O 流、面向对象三大特性、运算符重载与友元函数。适合有 C 基础转向 C++ 的开发者快速建立现代 C++ 编程思维。
为什么需要无锁编程 在多线程程序中,互斥锁(mutex)是最常用的同步原语,但它并非银弹。当线程竞争锁失败时,操作系统会将其挂起,引发一次开销可观的上下文切换。在高度竞争的场景下,多个线程反复获取和释放同一把锁,还会导致缓存行颠簸(cache line bouncing)——锁变量所在的缓存行在各个
C++ 是一门赋予了开发者底层内存控制能力的语言。理解其内存模型不仅是编写高效代码的基础,更是排查复杂 bug、设计高性能系统的关键。本文将系统性地剖析 C++ 的内存布局、RAII 设计哲学、对象生命周期管理、内存对齐细节、对象切片问题以及 Placement New 技术,最后给出符合现代 C+
本节讲类型层面的最后一块硬骨头:递归类型如何用「自我引用加终止条件」描述 JSON、树与深层修饰;编译器为什么会抛出 2589 与 2456 两类错误;TypeScript 4.5 的尾递归消除与累加器写法如何把深度上限提到上千。后半程转入类型性能治理,用 tsc 的 extendedDiagnostics 与 generateTrace 定位实例化热点,并给出可落地的优化清单。
本节讲解模板字面量类型如何把字符串拼接搬进类型系统:用反引号加 ${} 构造字面量模式,与联合类型组合时自动展开成笛卡尔积,配合 Uppercase 等内置工具与 infer 实现字符串解析、Trim、Split、Replace 等递归算法。最后落到类型安全的事件名、路由参数与 i18n 键三个真实场景,并说明贪婪匹配、无法反向推断与编译性能这三类坑。
本节把 TypeScript 标准库里的内置工具类型逐个拆开:从对象修饰的 Partial、Required、Readonly,到集合运算的 Pick、Omit、Exclude、Extract,再到函数与异步相关的 ReturnType、Parameters、Awaited。我们用第 9 章的映射类型与条件类型手写它们,讲清浅层修饰与 Omit 键不受约束这两个常见坑,并给出分组速查表。
本节以一支准备把老系统重构为 Spring Boot 的团队为引子,先用真实的 web.xml 与 applicationContext.xml 展示传统 Spring 的配置负担,再拆解 Spring Boot 的三条核心主张——约定优于配置、起步依赖、内嵌容器,讲清它解决了什么、没解决什么,并梳理 Spring 生态的分工。读完你能判断一个项目该不该上 Boot。
json.dumps/loads 的 ensure_ascii、indent、sort_keys、default 参数与中文坑,csv 的 DictReader/DictWriter、newline 的必要性与 Sniffer,3.11+ 只读的 tomllib,以及序列化安全:pickle 为何不能反序列化不可信数据、yaml.safe_load 与 JSON 的边界。
从 open() 的模式与 encoding 参数讲起,说清为什么必须显式指定编码;对比 read()、readlines() 与逐行迭代的内存差异,用 pathlib.Path 做现代路径操作,覆盖 glob/rglob/iterdir/walk、__file__ 定位、UTF-8 BOM 与 GBK 乱码排查,以及 tempfile 配合 os.replace 的原子写入。
字符串方法全景、切片与不可变、三种格式化的取舍与 f-string 调试写法、encode/decode 的编码错误处理,再到 re 模块的 match/search/fullmatch 区别、分组与命名分组、findall 与 finditer、贪婪与非贪婪、sub 回引,以及预编译缓存与一条日志解析实战。
以《孢子危机》的前兆章节为样章,说明如何从章节卡片、自然线索、人物视角和信息延迟四个方面启动危机线重写。
本节讲解类型运算的最后一块拼图:条件类型 T extends U ? X : Y 如何充当类型层面的 if/else,分布式条件类型在联合类型上的展开规则,以及用方括号包裹阻止分发的技巧。随后深入 infer 关键字,演示如何从函数签名、数组、元组和 Promise 中提取类型,并手写 Exclude、ReturnType 等工具类型的实现。读完你能看懂类型库的黑箱签名,并规避 never 陷阱。
本节讲解映射类型:如何用 [K in keyof T] 遍历一个类型的所有键并批量生成新类型,如何用 readonly 与 ? 的加减号增删修饰符,以及 TypeScript 4.1 引入的键重映射 as 如何借助模板字面量类型改写键名、借助 never 过滤掉不需要的键。本节会手写 Partial、Readonly、Required 等工具类型的内部实现,读完你能为自己的项目定制专用工具类型。
本节讲解 TypeScript 类型编程的三块基石:用 keyof 取出对象类型的全部键名,用 typeof 从运行时值反向推导类型,用索引访问类型 T[K] 精确取出某个属性或数组元素的类型。三者组合出的 keyof typeof 是工程中最常见的写法,能让类型与实现保持单一数据源。本节配有可运行示例与真实报错信息,读完你能读懂类型库中的索引写法,并为映射类型与条件类型打下基础。
静态类型检查器只能看代码,看不到运行时流入的 JSON、环境变量与用户输入。本节先划清静态类型的边界,再入门 Pydantic V2:用 BaseModel 定义模型、Field 加约束、model_validate / model_dump 序列化、field_validator / model_validator 写校验,并用 TypeAdapter 处理裸类型。
当同一段逻辑要处理多种类型时就需要泛型。本节从 TypeVar 与 bound 讲起,给出泛型函数与泛型类的写法,对照 3.12 的 PEP 695 新语法如何简化 type X = ...、class C[T] 与 def f[T];随后深入 Protocol 子类型、TypedDict、NamedTuple、@overload、Self 与 3.13 的 TypeIs,并讲清变型的直觉。
类型注解是 Python 静态分析的地基,运行时却几乎不做任何检查。本节从「写了 int 传 str 也能跑」讲起,梳理 Optional、Union、内置泛型、Literal、Final、Annotated 等语法,厘清 Any 与 object 的边界,再用 pyright 与 mypy --strict 在真实文件上跑出检查结果,并说明注解在运行时如何被读取、3.14 起为何默认延迟求值。