c++ - 为什么使用此模板会增加编译器时间?
问题描述
这是我正在编译的代码的一部分Plugin.cpp
:
...
addParam(MyModuleWidget::create<MyModuleButton>(Vec(10, 10), module, this, ParamEnum::RESET_PARAM, 0.0, 1.0, 0.0));
addParam(MyModuleWidget::create<MyModuleSwitch>(Vec(10, 10), module, this, ParamEnum::RUN_PARAM, 0.0, 1.0, 1.0));
addParam(MyModuleWidget::create<MyModuleKnob>(Vec(10, 10), module, this, ParamEnum::SEED_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleKnob>(Vec(10, 10), module, this, ParamEnum::CLOCK_SWING_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleKnob>(Vec(10, 10), module, this, ParamEnum::CLOCK_RANDOM_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleKnob>(Vec(10, 10), module, this, ParamEnum::CLOCK_OFFSET_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleKnob>(Vec(10, 10), module, this, ParamEnum::CLOCK_CURVE_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SECTION_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SECTION_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SECTION_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_2_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_2_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_3_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_3_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_3_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_4_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_4_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_4_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SECTION_4_STEP_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_2_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_2_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_3_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_3_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_3_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_4_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_4_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_4_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SECTION_4_STEP_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_2_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_2_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_3_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_3_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_3_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_4_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_4_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_4_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SECTION_4_STEP_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_2_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_2_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_3_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_3_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_3_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_4_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_4_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_4_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SECTION_4_STEP_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_SERIAL_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_SERIAL_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_SERIAL_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_SERIAL_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_1_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_5_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_6_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_7_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_8_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_9_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_10_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_11_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_12_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_13_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_14_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_15_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::SERIAL_STEP_16_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_DIV_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_DIV_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_DIV_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_DIV_2ND_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_DIV_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_DIV_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_DIV_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_DIV_2ND_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_DIV_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_DIV_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_DIV_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_DIV_2ND_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_DIV_2_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_DIV_3_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_DIV_4_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_DIV_2ND_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_LENGTH_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_LENGTH_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_LENGTH_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_LENGTH_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_LENGTH_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_LENGTH_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_LENGTH_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_LENGTH_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_VELOCITY_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_VELOCITY_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH1_VELOCITY_DIV_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_VELOCITY_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_VELOCITY_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH2_VELOCITY_DIV_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_VELOCITY_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_VELOCITY_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH3_VELOCITY_DIV_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_VELOCITY_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_VELOCITY_VAR_PARAM, 0.0, 1.0, 0.5));
addParam(MyModuleWidget::create<MyModuleSlider>(Vec(10, 10), module, this, ParamEnum::CH4_VELOCITY_DIV_PARAM, 0.0, 1.0, 0.5));
...
在另一个MyModuleWidget.cpp
文件上,如果我编写这个*create
函数,编译两个文件大约需要 2-3 秒:
struct MyModuleWidget {
//...
template <class T = MyModuleWidget>
static T* create(Vec pos, MyModuleModule *MyModuleModule, MyModuleModuleWidget *MyModuleModuleWidget, int paramId, float minValue, float maxValue, float defaultValue) {
T *widget = ParamWidget::create<T>(pos, MyModuleModule, paramId, minValue, maxValue, defaultValue);
return widget;
}
};
但是,如果我改用它(注意添加了一行代码):
struct MyModuleWidget {
//...
template <class T = MyModuleWidget>
static T* create(Vec pos, MyModuleModule *MyModuleModule, MyModuleModuleWidget *MyModuleModuleWidget, int paramId, float minValue, float maxValue, float defaultValue) {
T *widget = ParamWidget::create<T>(pos, MyModuleModule, paramId, minValue, maxValue, defaultValue);
widget->nwkModule = nwkModule; // added line
return widget;
}
};
编译文件大约需要 10(或更多)秒Plugin.cpp
。
这是怎么回事?为什么那条线的编译时间更长?
注意:如果需要,这里是 addParam 函数:
void ModuleWidget::addParam(ParamWidget *param) {
params.push_back(param);
addChild(param);
}
注意2:我注意到如果我T
在编译时使用 3 个不同的,它会变得“慢” Plugin.cpp
。例如:如果我只输入addParam
and MyModuleKnob
,MyModuleSlider
它很快。如果稍后我还在MyModuleButton
这些上添加类型addParam
,它会变得很慢。
解决方案
推荐阅读
- r - 将数据框列表导出为 csv
- excel - 如何在更改事件中构建 For-Next-Loop?
- java - 使用 Guice 初始化 Apache Beam ParDo 变换
- android - 使用 Bundle 将列表视图值从片段传递到片段时获取空对象引用
- assembly - 如何解决 * 将两个 8 位数据相乘并存储在 6000 位置及以后 * 在 MSDOS 中对于 masm 8086?
- javascript - 如何在具有假或真框架的窗口之间切换电子,具体取决于 url
- python - Pycharm 中的 Orca 文件问题
- flutter - 如何在 Flutter 中在 iOS 上运行 Webview
- c# - 如何在运行 dotnet restore 时使用私有 nuget 包源进行身份验证
- eloquent - Eloquents 的 Mutators/Accessors、模型的内部属性和 Casts 是如何相互关联的?