# 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`) **改动** 1. `Toolbar::BuildBoxes` 里唯一的 `dynamic_cast` 是**多余强转**(`Button::widget` 本来就是 `UiButtonWidget*`)。改为直接遍历 `m_buttons`(与 `m_root->Children()` 同源同序)。 2. 仅关 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` 换成自己的处理函数,行为等效。 3. `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` 段分配。 ### P2 Release 关闭异步展开表 + 修正 Debug 构建参数 —— ✅ 完成(提交 `94fc1c4`) **改动** 1. 新增 `RELEASE_ONLY_OPT = -fno-asynchronous-unwind-tables`,**只**加在 Release 的两条 编译规则上。`-fno-exceptions` 下绝大多数函数不再需要 `.pdata`/`.xdata`。 * 代价(已评估接受):Release 崩溃时 WER 拿不到可靠调用栈;不打印栈回溯的程序 功能不受影响,Debug 构建保留完整展开表。 * `-fno-unwind-tables`(全关)会链接失败,不采用。 2. **修正真实缺陷**:`DEBUG_OPT = -O0` 定义了却**从未被使用** —— Debug 的两条编译规则 误用 `$(RELEASE_OPT)`(`-Oz`),且全程没有 `-g`。所谓 "Debug 构建" 其实只是 "不 strip 的 Release",根本无法调试。现改用 `$(DEBUG_OPT) -g`,链接也加 `-g`。 **实测** | 指标 | 改前 | 改后 | | --- | --- | --- | | Release | 829,440 B | **793,088 B**(−36,352) | | `.pdata` | 30,420 B | 12,684 B | | `.xdata` | 28,904 B | 10,156 B | | Debug | 1,734,578 B | 5,992,064 B(真实 `-O0 -g`,属预期) | **验证**:release 与 debug 均全量重建,零 error 零 warning(`-O0` 下也没有新警告)。