首页 > 解决方案 > 为什么使用此模板会增加编译器时间?

问题描述

这是我正在编译的代码的一部分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。例如:如果我只输入addParamand MyModuleKnobMyModuleSlider它很快。如果稍后我还在MyModuleButton这些上添加类型addParam,它会变得很慢。

标签: c++templatesmingw-w64

解决方案


推荐阅读