C++ GCC-ARM操作系统模板函数优化

C++ GCC-ARM操作系统模板函数优化,c++,gcc,arm,embedded,compiler-optimization,C++,Gcc,Arm,Embedded,Compiler Optimization,使用(-O0)gcc none eabi工具链,链接器生成了上面的链接器映射(到目前为止还不错) 使用-Os链接器文件不再包含符号 我的问题是:这能优化到什么程度?有人知道我在哪里可以找到关于这个的文档吗。因为我会直接将模板放在GpioF7xx类中 实际上,我创建了一个静态工厂方法,因为我不希望二进制文件中的每个管脚都有一个单独的类 此外:我很感谢大家对我的评论,因为我来自网络,所以这可能会更加地道。并且没有专业的嵌入式/Cpp经验。您是否在任何地方使用此课程?如果编译器在优化大小时删除了未使用

使用(-O0)gcc none eabi工具链,链接器生成了上面的链接器映射(到目前为止还不错)

使用-Os链接器文件不再包含符号

我的问题是:这能优化到什么程度?有人知道我在哪里可以找到关于这个的文档吗。因为我会直接将模板放在GpioF7xx类中

实际上,我创建了一个静态工厂方法,因为我不希望二进制文件中的每个管脚都有一个单独的类


此外:我很感谢大家对我的评论,因为我来自网络,所以这可能会更加地道。并且没有专业的嵌入式/Cpp经验。

您是否在任何地方使用此课程?如果编译器在优化大小时删除了未使用的类型,我不会感到惊讶。应该是:
static\u assert(PIN>=0&&PIN<16,“Gpio引脚仅在0到15之间可用”)
可以优化到什么程度?
应该优化什么?代码速度?代码大小?你想达到什么目标?对我来说,这看起来是一个过早的优化。<代码>实际上我创建了一个静态工厂方法,因为我不想为我的二进制中的每个PIN都单独的类。< /C++ > C++中不需要这样的类。面向对象编程语言中需要工厂方法,因为一切都必须是类或对象的一部分。在C++中,你可以使用函数。然而,对于其他人来说,帮助你是相当困难的,因为不清楚你在这里想做什么。在我看来,这似乎是过早的优化。“Os”(最小化大小)优化器正在做它应该做的事情,去掉不必要的符号,删除非功能性代码以保持二进制大小较低。它优化了整个工厂的开销,所以实际上没有什么要做的了。我发现您的模板是在编译时验证pin的一种可以接受的惯用方法,所以
class GpioF7xx : public Gpio {
public:
    template <uint32_t PIN>
    static GpioF7xx create(GPIO_TypeDef* base) {
        static_assert(PIN >= 0 && PIN =< 15, "Gpio pins are only available from 0 to 15");

        return GpioF7xx(base, PIN);
    }
 .text._ZN8GpioF7xx6createILm6EEES_P12GPIO_TypeDef
            0x0000000008000a84       0x1c cmake-build-debug/main.o
            0x0000000008000a84                GpioF7xx GpioF7xx::create<6ul>(GPIO_TypeDef*)
 .text._ZN8GpioF7xx6createILm7EEES_P12GPIO_TypeDef
            0x0000000008000aa0       0x1c cmake-build-debug/main.o
            0x0000000008000aa0                GpioF7xx GpioF7xx::create<7ul>(GPIO_TypeDef*)
 ...