perf(size): 移除多余的 dynamic_cast 并省掉 56KB 的 C++ 名字反修饰器
两处独立收益: 1. Toolbar::BuildBoxes 里唯一的 dynamic_cast 是**多余强转**(Button::widget 本来就是 UiButtonWidget*),却让全项目必须开 RTTI。改为直接遍历 m_buttons(与控件树同源)。 最小复现程序实测:39,936 B -> 115,200 B(+75,264 B)。 2. RTTI 关掉后 cp-demangle.o 仍然在链接里 —— 真凶是 libstdc++ 的 vterminate.o (引用 __cxa_demangle)。本文件自行定义 __gnu_cxx::__verbose_terminate_handler(), 让它不再被拉入(本应用启动后会换成自己的 terminate 处理,行为等效)。 Makefile 新增 NO_RTTI=1(默认开启)-> CXXFLAGS += -fno-rtti。 实测:Release 890,880 -> 829,440 B(-61,440);.text 753,136 -> 703,616(-49,520); .rdata 36,936 -> 26,616(-10,320);Debug 1,801,617 -> 1,734,578(-67,039)。 release/debug 全量重建零警告。
This commit is contained in:
1 parent
86ff0291ba
commit
5de3763e72
3 files changed
+73
-16
No files matched your search
@@ -359,19 +359,21 @@ namespace jdi
|
||||
return;
|
||||
}
|
||||
// ⚠️ 跳过根控件:它的矩形与工具栏区域完全重合(已经被上一层登记过)。
|
||||
for (const std::unique_ptr<UiWidget>& button : m_root->Children())
|
||||
//
|
||||
// ⚠️⚠️ **这里绝不能出现 `dynamic_cast`**:旧写法用它把 `UiWidget*` 转成
|
||||
// `UiButtonWidget*`,但 `Button::widget` 本来就是 `UiButtonWidget*`。
|
||||
// 一个多余的转换会链入 RTTI 元数据 + `cp-demangle.o`(Release map 里
|
||||
// **56,320 B**;最小复现程序实测 **+75,264 B**),并逼得全项目无法用
|
||||
// `-fno-rtti`。现在改为直接遍历 `m_buttons`(与控件树同源,且无需转换)。
|
||||
for (const Button& spec : m_buttons)
|
||||
{
|
||||
if (button == nullptr)
|
||||
if (spec.widget == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
boxes.Add(button->Bounds(), 1);
|
||||
boxes.Add(spec.widget->Bounds(), 1);
|
||||
// 按钮**内容**(文本或齿轮图标)单独上报:它是居中绘制的,与按钮矩形不同。
|
||||
const UiButtonWidget* raw = dynamic_cast<const UiButtonWidget*>(button.get());
|
||||
if (raw != nullptr)
|
||||
{
|
||||
boxes.Add(raw->ContentRect(), 2);
|
||||
}
|
||||
boxes.Add(spec.widget->ContentRect(), 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user