当我在C++中的一个自由函数中实例化一个静态对象时,为什么我会得到双倍的二进制大小



在嵌入式系统(Cortex-M4(上,我编写了用GCCarm-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文件中,我有一个与extern "C"关键字链接的免费函数myDriver_init
空闲函数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

我认为函数中的静态变量/对象是放在堆中的。这里有什么不同?

我在大二进制文件的映射文件中看到一些std::bad_exception。尽管具有CCD_ 12和CCD_。

当你在函数内部创建静态对象时,编译器似乎会以某种方式将更多的代码生成到最终的二进制文件中,就像我在问题中的例子一样
这段代码与异常有关,在我的情况下,这不是一个理想的结果。

更改中的链接器标志

-specs=nosys.specs

-specs=nano.specs

解决了问题。

相关内容

  • 没有找到相关文章