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)零警告。
57 lines
2.1 KiB
Markdown
57 lines
2.1 KiB
Markdown
# 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` 段分配。
|
||
|