原文件混杂了标签页、派生信号、菜单、工具栏、键盘鼠标、布局调试绘制六类职责,
是本项目最大的“大杂烩”单文件之一。按职责纯搬移(零逻辑改动):
- ApplicationTabs.cpp (355 行): 标签页新建/关闭/切换/重排、视图同步、窗口标题、
标签栏结果回调、标签页右键菜单、待提交改名。
- ApplicationDerive.cpp (786 行): 派生烘焙、重采样、选区截取(新建/就地)、克隆(含带调整)。
- ApplicationMenus.cpp (409 行): 绘图区右键菜单、菜单数值回写、主题切换、设置菜单、
菜单结果派发。
- ApplicationCommands.cpp (642 行): 分组/信号增删、移动与重排、文件对话框、工具栏动作、
键盘鼠标分发、布局边界绘制。
Makefile 按目录通配收集,无需登记新文件。
验证:release 零 error 零 warning;产物 793,088 -> 794,112 B(+1,024,LTO 内联边界变化,
< 0.13%,属结构性拆分不可避免的噪声)。
4.9 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 段分配。
P2 Release 关闭异步展开表 + 修正 Debug 构建参数 —— ✅ 完成(提交 94fc1c4)
改动
- 新增
RELEASE_ONLY_OPT = -fno-asynchronous-unwind-tables,只加在 Release 的两条 编译规则上。-fno-exceptions下绝大多数函数不再需要.pdata/.xdata。- 代价(已评估接受):Release 崩溃时 WER 拿不到可靠调用栈;不打印栈回溯的程序 功能不受影响,Debug 构建保留完整展开表。
-fno-unwind-tables(全关)会链接失败,不采用。
- 修正真实缺陷:
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 下也没有新警告)。
P7 面板状态/滚动量收敛为唯一派发点 —— ✅ 完成(提交 7a3fefb)
问题(屎山核心之一):Lane 里 7 种实验性功能各有 1 份 LanePanelState + 1 个滚动偏移
(14 个字段)。旧实现在每一处“按种类取用”的地方各写一遍嵌套三元式或 switch:
EdgePanelLayoutFor 5 条 7 层嵌套三元式;标题栏拖拽、✕ 关闭、滚轮、滚动条、错开序数各写一遍。
新增面板要改 20+ 处,漏一处就是「拖不动 / 关不掉 / 滚轮滚不到底」
(MARK、RESAMPLE、CLIP 均真实踩过)。
改动:PlotViewInternal.hpp 新增唯一派发点
LanePanelEnabled / LanePanelStateOf / LanePanelScrollOf(可写 + 只读)。
这些 switch 穷举 7 种且不写 default: ⇒ -Wswitch 在漏登记时编译报警
(已用最小程序验证 -Wswitch 确实会报)。
调用点:布局 5 条三元式 → 3 行;标题栏拖拽 7 分支 switch → 1 次写入;
滚轮/滚动条/✕ 关闭/折叠切换全部改为穷举无 default。
验证:release + debug 零 warning;产物 793,088 B 不变(等价变换,说明只是结构收敛)。
未做(受验证条件限制):尚未把 EdgePanelLayoutFor 的 957 行分支整体改成
“每面板一行元数据表”。原因:没有可用的离屏像素对比工具(.preflight 已删除,
且崩溃会弹模态框),纯逻辑重写无法自证“像素完全一致”。已通过上面的派发收敛
消除最容易出错的一类重复,剩余重复属于“几何算式本身”,风险高于收益。