1. Release 专用 `-fno-asynchronous-unwind-tables`(新增 RELEASE_ONLY_OPT,只加在 Release 的两条编译规则上)。-fno-exceptions 下绝大多数函数不再需要 .pdata/.xdata: 实测 829,440 -> 793,088 B(-36,352);.pdata 30,420 -> 12,684、.xdata 28,904 -> 10,156。 Release 不再生成可靠的栈回溯(崩溃诊断);Debug 保留完整展开表。 2. 修正真实缺陷:Makefile 的 DEBUG_OPT = -O0 从未被使用 —— Debug 两条编译规则误用了 $(RELEASE_OPT)(即 -Oz),且全程没有 -g,因此所谓 Debug 构建其实只是"不 strip 的 Release"。现在 Debug 规则改用 $(DEBUG_OPT) -g,链接也加 -g。 代价:Debug 产物 1,734,578 -> 5,992,064 B(真实 -O0 -g,属预期)。 release(全量)790KB 零警告;debug(全量 -O0 -g)零警告。
2.1 KiB
2.1 KiB
Code Review 进度(分支 Code_Review)
每个节点完成后追加:节点号、改动摘要、验证方式、实测数字。 计划见
Documents/Code_Review_Plan.md;最终报告见Documents/Code_Review_Report.md。
基线(起点 764e5be)
| 项 | 数值 |
|---|---|
| Release 产物 | 890,880 B |
.text |
753,136 B |
.rdata |
36,936 B |
.pdata |
30,420 B |
.xdata |
29,496 B |
.rsrc |
20,656 B |
.idata |
12,856 B |
| Debug 产物 | 1,801,617 B |
| 源码规模 | 约 5.6 万行 |
关键发现(详见计划 §一):
dynamic_cast(Toolbar.cpp:370)使最小复现程序从 39,936 B 涨到 115,200 B ⇒ +75,264 B;map 中cp-demangle.o占 56,320 B。- 每个
EdgePanelKind在源码中出现 21–26 次(6 种面板 ⇒ 约 140 处手写分支)。
节点记录
(下面按完成顺序追加)
P1 移除 dynamic_cast + 关闭 RTTI —— ✅ 完成(提交 5de3763)
改动
Toolbar::BuildBoxes里唯一的dynamic_cast是多余强转(Button::widget本来就是UiButtonWidget*)。改为直接遍历m_buttons(与m_root->Children()同源同序)。- 仅关 RTTI 不够:
cp-demangle.o仍在链接里。真凶是 libstdc++ 的vterminate.o(引用__cxa_demangle),它被eh_terminate.o的std::terminate拉入。 ⇒ 在Utilities/Src/MemProbe.cpp里自行定义__gnu_cxx::__verbose_terminate_handler(), 归档成员vterminate.o不再被拉入,demangler 整体消失。 应用启动后本来就会std::set_terminate换成自己的处理函数,行为等效。 Makefile新增NO_RTTI=1(默认开)→CXXFLAGS += -fno-rtti。
实测
| 指标 | 改前 | 改后 | 差 |
|---|---|---|---|
| Release | 890,880 B | 829,440 B | −61,440 B |
.text |
753,136 B | 703,616 B | −49,520 B |
.rdata |
36,936 B | 26,616 B | −10,320 B |
| Debug | 1,801,617 B | 1,734,578 B | −67,039 B |
验证:release + debug 全量重建(删 *.o/*.d)零 error 零 warning;
map 中 cp-demangle.o 已无 .text 段分配。