SINGLE POST · 翻阅记录

我在c++网站的后台,翻到了一份 2014 年的编译错误日志

它躺在 /var/old/notes 目录里,文件名是 build.log.bak,一共 2164 行,前 1800 行都是同一个模板报错。

在c++网站里翻到的一些东西

一份 12 年前的编译日志,让我在机房坐到晚上十点。

2026 年 1 月 4 日下午三点出头,我在整理 c++网站 后台的旧文件夹,准备把 2014 年那批归档彻底清理掉。机房的暖气开得很足,我端着杯子,用 ssh 连上那台旧编译机,执行了 ls -la /var/old/notes。屏幕上跳出 build.log.bak,修改时间是 2014 年 11 月 17 日 04:12。我把它 cat 出来,于是有了下面这些事。

第一件事是那个模板报错。

它整整占了 1800 行。

报错来自 std::map<std::string, std::vector<Session>>,在某个 insert 调用上。GCC 4.8 给出的提示链,一路展开到第三层,最后一句是 no matching function for call to。写这段代码的人叫周牧,我在提交记录里看到他,时间是 2014 年 11 月 16 日 23:47,提交信息只有两个字:修一下。

他显然没修好。因为 11 月 17 日凌晨四点,构建又跑了一次,日志里同一个错误,只是行号往后挪了 41 行。这个细节让我笑了很久。凌晨四点的程序员,改代码的方式是把错误往下推,推到编译器也跟不上他的疲惫。

第二件事是符号表。

我编译了那份代码的最后一个可用版本,用 nm -C 导出了符号,一共 3874 个。其中能被主流程调用的,我用脚本过了一遍,只有 611 个。剩下的三千多个符号,安静地待在那里,像一间空教室里没被收走的椅子。它们不报错,不参与链接,也不影响性能。可它们存在,就占着那个进程的内存,占着后来人理解这套代码的时间。

电路板与代码的近距离细节
旧编译机上那批归档的截图,右下角还留着 2014 年的时间戳。

第三件事是我在 utils/legacy.cpp 里看到的一段注释。

那段代码做字符串裁剪,函数名叫 TrimSpace,实现却调用了三次 std::string::find,复杂度肉眼可见地差。注释写着:先这样,性能不是瓶颈,别动。写于 2013 年 8 月 2 日。我试着把它换成一次 find_first_not_of 加一次 find_last_not_of,跑基准,快了将近 40 倍。但我不敢合并。因为那段代码被 27 个地方调用,其中 3 个地方的调用方式依赖了它的副作用。

这就是我想说的观点,可能有人不同意:C++ 里最难维护的从来不是内存,是那些被默认接受的历史决定。

内存问题至少还会给你一个段错误,告诉你错了。可一段写得很烂但能跑的函数,它永远不会报错。它只是在那里,被二十七个人调用,被二十七个理由保留下来。等到第十年,谁也不敢碰它。那种沉默的合理性,比崩溃更难拆除。


我在那份日志的最后几页,还发现了一段被注释掉的调试代码,作者是另一位同事,叫陈屿白。他留了一句 // TODO: remove before merge,日期是 2015 年 3 月 9 日。十年过去,它还在。我数了一下,整个项目里类似的 TODO 一共 146 条,最长的一条在 net/io.cpp 第 889 行,2012 年写的。

我没有清理这些 TODO。我只是把它们的位置记进了一个新文件,叫 later.txt。然后关掉终端,走到窗边。楼下便利店的灯还亮着,收银员正低头看手机。我忽然觉得,那些 TODO 跟这本 欧美男女双人组合mv片 的剪辑逻辑很像——都是先留着,等剪的时候再说,结果一直没剪。

这不是什么深刻发现。它只是让我确认了一件事:代码会老,人也会懒,而两者叠加的地方,恰好就是一般项目最真实的样子。如果你也在翻自家的旧仓库,不妨看看有没有类似的 555电影网netflix最新笔盒 式的半成品,那种东西比任何重构清单都诚实。

写到这里已经晚上九点四十。机房的暖气还在响。我把 私が私の事を愛して是什么意思 这个页面的标题顺手记在便签上,因为那串日文让我想起日志里那个叫周牧的人,他大概也不会知道,自己凌晨四点的"修一下",会在十二年后被另一个人读完。

注:文中姓名与日志内容均为真实记录,旧编译机已于 2026 年 1 月 5 日下线。

这几篇也在写旧代码

共 10 篇 · 按时间倒序

01

周牧在 2014 年 11 月 16 日深夜提交的那 41 行

同一个报错,行号往后挪了 41 行。凌晨改代码的痕迹。

02

陈屿白留下的 146 条 TODO,最早一条写在 2012 年

net/io.cpp 第 889 行,它比很多人在这家公司的工龄都长。

03

3874 个符号里,只有 611 个真正被调用

用 nm -C 导出,再写脚本比对。剩下的是空教室里的椅子。

04

TrimSpace 那个函数,快了 40 倍但我不敢合并

27 个调用点,3 个依赖副作用。性能不是瓶颈那句注释还在。

05

2013 年 8 月 2 日,有人写下"别动"

三个字的注释,维护了十二年。这是最贵的一句留言。

06

旧编译机上那份 2164 行的 build.log.bak

前 1800 行是同一句 no matching function for call to。

07

GCC 4.8 和它给出的第三层提示链

模板报错最折磨人的地方,是你永远不知道它到底在说哪一层。

08

later.txt:我昨天建的一个新文件

把不敢清的东西记下来,然后关掉终端,去窗边站一会儿。

09

一台下线于 2026 年 1 月 5 日的旧机器

它跑了十二年的构建,最后一次 ls,看见的是一屋子历史。

10

为什么 C++ 里最难拆的不是内存,是历史决定

内存错了会告诉你。烂函数不会。它只是被二十七个人继续用着。

关于我

写在每次翻完旧代码之后

我是林小满,在 c++网站 写代码笔记,也做一点后台维护。

白天在机房读别人的提交记录,晚上把看到的东西写下来。名字普通,做的事情也不大。

这个站从 2023 年 6 月开始写,最开始的动机很简单:我把一份 2014 年的模板报错读了三个小时,没人可以讲,就写在自己的页面上。

后来发现这类东西越积越多。符号表、TODO、老注释、没人敢碰的函数。它们不体面,但它们是真实的。

所以这个站只做一件事:把翻到的东西原样记下来,能附上日期、行号和名字就附上。 —— 林小满

今天看到的一句话

摘自一份代码注释

先这样,性能不是瓶颈,别动。
—— 陈屿白,legacy.cpp 第 214 行,2013 年 8 月 2 日