gcc 为什么在C++中示例化自由函数中的静态对象时,会得到双倍的二进制大小?

pgpifvop  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(119)

在嵌入式系统(Cortex-M4)上,我编写了使用GCC arm-none-eabi-g++编译的C++。编译器版本10.2.1 20201103
我的代码有点复杂,复制粘贴在这里,所以这里有一个例子:
我有一个抽象硬件外设的类。

class A
{
public:
    void init(void)
    {
        // initializes hardware peripheral
    }
    // other public functions here
private:
   int x,y;
   // other private variables here
};

我想在RTOS任务中使用这个类。
a.cpp文件中,我有一个自由函数myDriver_init,它与extern "C"关键字相链接。
自由函数myDriver_init创建一个RTOS任务,并给它一个回调函数以运行。

extern "C" myDriver_init(void)
{
    static A a;
    create_RTOS_task(&myDriver_state_machine, &a, priority, stack_size);
}

void myDriver_state_machine(void * param)
{
    A * a_ptr = static_cast<A*>(param);
    a_ptr->init();
    while(true)
    {
        //user code here...
    }
}

main.c中,我像这样调用C链接函数

int main(void)
{
    myDriver_init();
    ...
    RTOS_Task_run();
}

问题是当对象a在函数myDriver_init内时,为什么我得到的二进制文件几乎是两倍大小?
如果我把它移到外面,并把它作为一个全局变量,二进制文件的大小会明显变小。

static A a;
extern "C" myDriver_init(void)
{
    create_RTOS_task(&myDriver_state_machine, NULL, priority, stack_size);
}

void myDriver_state_machine(void * param)
{
    a.init();
    while(true)
    {
        //user code here...
    }
}

为什么会发生这种情况?
在这两种情况下,我使用的优化都是-O2
我以为函数中的静态变量/对象都放在堆中。这里有什么不同吗?
我在大二进制文件的Map文件中看到了一些std::bad_exception。尽管有-fno-rtti-fno-exceptions标志。

g6ll5ycj

g6ll5ycj1#

当你在函数中创建静态对象时,编译器似乎会在最终的二进制文件中生成更多的代码,就像我在问题中的例子一样。
这段代码与异常有关,在我的例子中,这不是一个理想的结果。
将链接器标志从

-specs=nosys.specs

-specs=nano.specs

解决了问题。

相关问题