我正在使用为 arm-eabi 编译的 GCC/G++ 开发嵌入式应用程序。由于资源限制,我试图禁用标准 C++ 异常处理。我正在使用“-fno-exceptions -nostartfiles -ffreestanding”编译代码。
当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,就会链接到很多异常处理代码。这不会那么糟糕,除了它也带来了很多stdio 的东西,比如 printf、fopen、fclose 和其他 FILE 函数。这个应用程序没有文件系统,即使有,这些函数也会浪费太多的代码空间。
我知道即使使用 -fno-exceptions,G++ 也会在使用异常的运算符 new 中链接,因为该库没有使用非异常的运算符 new(new(nothrow) 除外)。我为 operator new 和 delete 创建了替换,它们链接到输出以及不需要的标准库函数。
令我困惑的是,我没有在任何地方调用 new。只有当一个全局对象包含另一个对象时,所有这些代码才会链接到其中。
例如:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
如果创建了 UartA 的全局实例,则不会链接异常处理、operator new 和 stdio 内容。这就是我想要的。
如果创建了 UartB 的全局实例(其中 rxbuf 是实例而不是指针),则会链接不需要的代码。
UartA 和 UartB 都不使用 operator new、exceptions 或 stdio。它们的区别仅在于 rxbuf 的类型。
你能建议如何防止链接额外的代码吗?另外,为什么这与 UartB 相关联,而不是 UartA?