小编R S*_*R S的帖子

有没有一种方法可以使“gcc”转储/显示编译代码时使用的所有标志?

请注意,这与从已编译的可执行文件中获取编译器选项不同吗 ?我确实详细地经历过。

虽然-frecord-gcc-switches很棒,但它只捕获命令行参数。

例如,我对捕获-O2通常在命令行中传递的内容不感兴趣。-fauto-inc-dec我更好奇的是记录所有由 启用的标志-O2

(与上面的链接相反,请注意,我可以访问源代码、编译器和构建基础设施。我只想在编译期间捕获标志。对任何特定的 gcc 版本不挑剔)

gcc arm

5
推荐指数
1
解决办法
1501
查看次数

我是否错过了某些内容?还是虚拟通话的效果不如人们对它们的评价

我一直在为嵌入式环境开发一个简单的框架。我决定要使用虚拟调用,CRTP还是使用switch语句。有人告诉我vtables在嵌入式中的性能很差。
从这个问题开始, vvable性能下降vs. switch语句, 我决定运行自己的测试。我用三种不同的方法来调用成员函数。

  1. 使用etl库的etl :: function,该库旨在模仿stl库,但适用于嵌入式环境。(无动态分配)。
  2. 使用主开关语句,该语句将根据对象的int ID调用对象的
  3. 使用对基类的纯虚拟调用

我从来没有尝试过使用基本的CRTP模式,但是etl :: function应该是该模式所使用的机制的变体。我使用MSVC并在ARM Cortex M4上获得类似性能的时间是

  1. etl:4亿纳秒
  2. 开关:4.2亿纳秒
  3. 虚拟:2.9亿纳秒

纯虚拟呼叫明显更快。我是想念某些东西还是虚拟通话,不如人们所说的那么糟糕。这是用于测试的代码。

 class testetlFunc
{
public:
    uint32_t a;

    testetlFunc() { a = 0; };

    void foo();
};

class testetlFunc2
{
public:
    uint32_t a;

    testetlFunc2() { a = 0; };

    virtual void foo() = 0;
};

void testetlFunc::foo()
{
    a++; 
}


class testetlFuncDerived : public testetlFunc2
{
public:
    testetlFuncDerived(); 

    void foo() override;
};

testetlFuncDerived::testetlFuncDerived()
{ 
}

void testetlFuncDerived::foo()
{
    a++; 
}


etl::ifunction<void>* timer1_callback1; …
Run Code Online (Sandbox Code Playgroud)

c++ embedded virtual vtable

4
推荐指数
1
解决办法
129
查看次数

标签 统计

arm ×1

c++ ×1

embedded ×1

gcc ×1

virtual ×1

vtable ×1