在c++网站里翻到的一些东西
一份 12 年前的编译日志,让我在机房坐到晚上十点。
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 个。剩下的三千多个符号,安静地待在那里,像一间空教室里没被收走的椅子。它们不报错,不参与链接,也不影响性能。可它们存在,就占着那个进程的内存,占着后来人理解这套代码的时间。
第三件事是我在 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 日下线。