同一行代码,不同结果:C/C++表达式求值顺序为何让编译器各行其是

一段代码,在GCC下输出1 2,在Clang下输出2 1,在MSVC下又是另一种结果。这不是编译器的bug,而是C/C++语言规范有意为之的设计——或者说,是一个困扰了程序员三十多年的"特性"。 ...

11 min · 5484 words

Python的GIL为何困守三十年:从单线程性能到多核时代的漫长博弈

2007年9月,Python创始人Guido van Rossum在一篇博客文章中写下了一段被无数次引用的话: “我会欢迎移除GIL的补丁——但前提是单线程程序的性能不能下降。” ...

14 min · 6545 words

内存泄漏:为什么即使有垃圾回收,你的程序仍在悄悄泄漏内存

title: “内存泄漏:为什么即使有垃圾回收,你的程序仍在悄悄泄漏内存” date: “2026-03-05T16:36:29+08:00” description: “从2012年AWS宕机事件到Chrome DevTools堆快照分析,深入剖析内存泄漏的本质——不是技术缺陷,而是资源管理的系统性失误。本文涵盖手动内存管理语言(C/C++)与垃圾回收语言(Java、Go、JavaScript)的不同泄漏模式,对比Valgrind与AddressSanitizer的检测策略,揭示RAII、智能指针、弱引用等防御机制的设计哲学。” draft: false categories: [“系统架构”, “编程语言”, “技术原理”] tags: [“内存泄漏”, “垃圾回收”, “内存管理”, “RAII”, “Valgrind”, “AddressSanitizer”, “智能指针”, “性能优化”] 2012年10月22日,Amazon Web Services遭遇了一次看似普通的故障。一台数据收集服务器被更换后,DNS地址没有正确传播,导致部分服务器持续尝试连接这台已下线的机器。这个持续的重试行为触发了内存泄漏。更致命的是,负责监控内存的内部警报系统同时失效——所有仪表盘显示绿色,而系统正在走向崩溃。 ...

12 min · 5648 words

Go错误处理为何十年无法达成共识:从try提案到彻底放弃的完整技术分析

2025年6月,Go团队在官方博客发表了一篇题为"[On | No] syntactic support for error handling"的文章,宣布了一个意味深长的决定:停止追求错误处理的语法级改进,关闭所有相关的开放提案。这不是一次普通的功能延期,而是Go语言诞生十六年来,在错误处理这个核心议题上的彻底认输。 ...

10 min · 4903 words

当Rust进入Linux内核:一门语言的十七年逆袭

2006年的一天,Graydon Hoare回到公寓,发现电梯又坏了。他住在21楼。 爬楼梯的时候,这位Mozilla的程序员越想越气。“我们这些搞计算机的,连个电梯软件都写不好?“他后来回忆道,“这太荒谬了。” ...

13 min · 6263 words

正则表达式的阴暗面:为什么一行代码能让服务器瘫痪二十七分钟

2019年7月2日,保护着全球约20%互联网流量的Cloudflare遭遇了一次持续27分钟的全球性宕机。原因令人意外:一个正则表达式。 更准确地说,是这个正则表达式: ...

12 min · 5756 words